6

我想回显 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我的一个单元测试中找不到的命令。我正在使用这个hack/trick 来更改我的 PATH 并通过检查结果processBuilder.environment()并确定传递给进程的 PATH 变量不应该允许查找排序(我已经尝试过空字符串和随机路径)。我想看看外壳是否在做任何有趣的事情并修复我试图破坏的 PATH 。

4

1 回答 1

7

$PATH是在bash(和其他 shell)中用于引用环境变量的语法PATH。因为它是echo您使用 ProcessBuilder 执行的bash,所以它不打印环境变量的内容也就不足为奇了。

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


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

[...]  ImmutableList.of("/bin/bash","-c","echo $PATH")  [...]

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

于 2012-02-20T21:02:18.290 回答