【问题标题】:Is "bash" required to run exec commands from Java?从 Java 运行 exec 命令是否需要“bash”?
【发布时间】:2020-05-19 19:37:33
【问题描述】:

记录的输出显示正在运行的命令,可以看出这包括bash 命令:

thufir@dur:~/NetBeansProjects/threadedExecTelnet$ 
thufir@dur:~/NetBeansProjects/threadedExecTelnet$ gradle run                                                       

> Task :run                                                                                                        
May 19, 2020 12:25:47 P.M. net.bounceme.dur.exec.ExecList execute
INFO: [bash, -c, ls /home/thufir/NetBeansProjects/threadedExecTelnet]
build
build.gradle
gradle
gradlew
gradlew.bat
LICENSE
README.md
settings.gradle
src

BUILD SUCCESSFUL in 859ms
3 actionable tasks: 1 executed, 2 up-to-date
thufir@dur:~/NetBeansProjects/threadedExecTelnet$                          

虽然我不太介意费力和冗长的代码:

public void execute() throws IOException {
    log.info(listToExec.toString());

    String[] arrayToExec = listToExec.toArray(new String[0]);
    Process process = Runtime.getRuntime().exec(arrayToExec);

    InputStream inputStream = process.getInputStream();
    Reader inputStreamReader = new InputStreamReader(inputStream);
    try (BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
        String line = null;
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
            System.out.flush();
        }
    }
}

我不明白为什么,有时,bash 似乎是必需的,而有时则不是。

【问题讨论】:

  • 'ls' 是一个 bash 命令,所以运行它肯定需要 bash

标签: java exec inputstream bufferedreader runtime.exec


【解决方案1】:

对于内置于 shell 的命令,第一个参数必须是 shell。但是,如果要运行的命令是一个普通的可执行文件,那么直接使用合格的路径应该可以工作。对于“ls”,您可以检查:

which ls

这可能会打印 /bin/ls 或类似内容,因此您可以尝试在没有 bash 的情况下从 Java 启动:

listToExec = new String[] {"/bin/ls", "/home/thufir/NetBeansProjects/threadedExecTelnet"}

请注意,有些人可能有“ls”的 shell 别名,因此 /bin/ls 的行为可能与普通 bash 会话中的“ls”或通过 java 调用“bash -c ls blah”的行为不同

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2016-04-26
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多