从Java中运行exec命令需要 "bash "吗?

问题描述 投票:0回答:1

日志输出显示了运行的命令,可以看到其中包括一个 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 是必需的,其他时候则不需要。

java exec inputstream bufferedreader runtime.exec
1个回答
0
投票

对于内置在shell中的命令,那么第一个参数需要是shell。但是如果要运行的命令是一个普通的可执行文件,那么直接使用限定路径就可以了。对于 "ls",你可以检查一下。

which ls

这可能会打印出binls或类似的结果 所以你可以尝试从Java中启动而不用bash as:

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

请注意,有些人可能用shell别名来表示 "ls",所以直接用binls和在正常的bash会话中用 "ls "或者通过java调用 "bash -c ls blah",可能会有不同的行为。

© www.soinside.com 2019 - 2024. All rights reserved.