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

标签 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);

一些额外的上下文:

我正在尝试模拟未在我的单元测试中找到的 sort 命令。我正在使用 this hack/trick 改变我的 PATH 并通过检查 processBuilder.environment() 的结果,确保传递给进程的 PATH 变量不允许查找排序(我试过空字符串以及随机路径)。我想看看 shell 是否在做任何有趣的事情并修复我试图破坏的 PATH。

最佳答案

$PATHbash(和其他 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/

相关文章:

Java:在Windows 上安装JDK 后应该设置哪些必要的环境变量,如何设置?

javascript - 如何在React vite应用程序中的index.html中使用env

http - 我应该包括 Meteor 的 $ROOT_URL 环境变量的协议(protocol)吗?

java - 正则表达式匹配特殊字符除了连字符与数字混合

java - 注入(inject)属性文件覆盖应用程序中定义的属性文件

java - 使用 Com4j 或 Jacob 连接 64 位 Java 和 32 位 COM dll

java - mac 机器上有不同的 java 版本吗?

JavaFx 图像路径

java - 递归显示根文件夹下的所有文件以及每个文件的目录

jenkins - Jenkins 管道中的导出命令