【问题标题】:Unable to send parameters to bash script from java无法从java向bash脚本发送参数
【发布时间】:2017-01-01 03:12:11
【问题描述】:

我正在尝试通过 Java 在我的 Ubuntu 机器上运行 bash 脚本。 bash 脚本将 2 个输入作为我作为数组传递的参数 但是,它似乎没有将array[0]和array[1]的值传递给bash脚本?

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.omg.CORBA.portable.InputStream;

public class readBashScript {

    public static void readBashScript() {
        try {

            String[] array = {"ys1","R"};

            Process proc = Runtime.getRuntime().exec("var/www/red/marsh_webreset.sh /",array); 
            BufferedReader read = new BufferedReader(new InputStreamReader(
                    proc.getInputStream()));
            try {
                proc.waitFor();
            } catch (InterruptedException e) {
                System.out.println(e.getMessage());
            }
            while (read.ready()) {
                System.out.println(read.readLine());
            }
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }
}

【问题讨论】:

  • 我在使用 Runtime.exec 时遇到了类似的问题。我认为我的解决方案是将参数直接包含在程序中以执行 String
  • 推荐的方法是使用ProcessBuilder,尽管使用shellshock这似乎是一段非常危险的代码。
  • 当您直接在程序中说时,您是指在 bash 脚本中吗?因为我会实时听取用户的意见
  • 不,我的意思是在“var/www/red/marsh_webreset.sh /”之后

标签: java bash


【解决方案1】:

查看一些文档。

您传递给 exec 方法的第二个参数是:

envp -- 字符串数组,每个元素都有环境变量设置,格式为 name=value,如果子进程应该继承当前进程的环境,则为 null。

我建议看看thisthis

如果要传递环境变量,可以将它们添加为数组,但必须采用“key=value”格式。

IE:

$ ONE=1 TWO=2 shell.sh

然后您可以在 shell 脚本中回显这些变量。

$ 回声 $ONE

【讨论】:

  • 这是一个有效的批评,但它不能解决问题,或者?
  • 已编辑以添加实际用法。
【解决方案2】:

你传递的参数不正确试试下面的代码:

Process proc = Runtime.getRuntime().exec("/var/www/redbutton/marsh_webreset.sh "+array[0]+" "+ array[1]+" /");

【讨论】:

    【解决方案3】:

    您似乎调用了错误的Runtime.exec() 方法。您正在传递一个命令和一组环境变量,但您想将参数传递给您正在执行的进程。而不是exec(String, String[]),你想调用exec(String[])

    您可能还想查看错误流 - 它可能包含信息丰富的错误消息。此外,我不确定命令字符串末尾的/ 是否有用,甚至是否有效。你可能也不想导入org.omg.CORBA.portable.InputStream

    【讨论】:

      【解决方案4】:

      您应该一次发送数组的每个值。您不能将数组原样作为参数发送给 bash 脚本,因为它不能自行提取值。

      进程 proc = Runtime.getRuntime().exec("/var/www/redbutton/marsh_webreset.sh "+array[0]+" "+array[1]+" /");

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-12
        • 1970-01-01
        • 2010-11-01
        • 1970-01-01
        • 2014-07-27
        • 2020-07-14
        相关资源
        最近更新 更多