我想回显 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);
一些额外的上下文:
我正在尝试模拟未在我的单元测试中找到的 sort
命令。我正在使用 this hack/trick 改变我的 PATH 并通过检查 processBuilder.environment()
的结果,确保传递给进程的 PATH 变量不允许查找排序(我试过空字符串以及随机路径)。我想看看 shell 是否在做任何有趣的事情并修复我试图破坏的 PATH。
最佳答案
$PATH
是 bash
(和其他 shell)中用来引用环境变量 PATH
的语法。因为它是使用 ProcessBuilder 而不是 bash
执行的 echo
,所以它不打印环境变量的内容也就不足为奇了。
您应该从 Java 获取环境变量的内容,并将其作为参数传递给外部进程,或者执行能够正确解释 $PATH
语法的程序, (例如 bash
)。
正如您在下面的评论中所指出的,
[...] ImmutableList.of("/bin/bash","-c","echo $PATH") [...]
确实打印了PATH环境变量的内容。
关于java - 使用 Java ProcessBuilder 执行 "echo"不会插入变量(输出字符串 "$PATH"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9368311/