使用Java ProcessBuilder执行“ echo”不会插入变量(输出字符串“ $ PATH”)

Zug*_*alt 5 java path environment-variables echo processbuilder

我想回显PATH变量,目标是从Java ProcessBuilder获得与echo $PATH在终端中运行相同的输出。但是,在执行输出时,实际上是输出$PATH而不是PATH变量的值。我想知道ProcessBuilder是否在转义$,并且有防止这种情况的技巧吗?

这是我正在谈论的代码示例,它输出字符串“ $ PATH”:

List<String>  processBuilderCommand = ImmutableList.of("echo","$PATH");

ProcessBuilder processBuilder = new ProcessBuilder(processBuilderCommand).redirectErrorStream(true);

final Process process = processBuilder.start();

String commandOutput = CharStreams.toString(CharStreams.newReaderSupplier(new InputSupplier<InputStream>() {
                @Override
                public InputStream getInput() throws IOException {
                    return process.getInputStream();
                }
            }, Charset.defaultCharset()));

System.out.println(commandOutput);
Run Code Online (Sandbox Code Playgroud)

一些额外的上下文:

我试图模拟sort我的单元测试之一找不到的命令。我正在使用技巧/技巧来更改我的PATH,并检查结果processBuilder.environment()并确定传递给进程的PATH变量是否足够不允许查找排序(我尝试了空字符串和随机路径)。我想看看shell是否正在做任何有趣的事情并修复我试图破坏的PATH。

aio*_*obe 5

$PATHbash(和其他外壳程序)用于引用环境变量的语法PATH。由于它是echo使用ProcessBuilder执行bash的,因此它不打印环境变量的内容也就不足为奇了。

您应该掌握Java环境变量的内容,并将其作为外部进程的参数,或者执行一个能够$PATH正确解释语法的程序(例如bash)。


正如您在下面的评论中指出的那样,

[...]  ImmutableList.of("/bin/bash","-c","echo $PATH")  [...]
Run Code Online (Sandbox Code Playgroud)

确实会打印PATH环境变量的内容。