Выполнение «echo» с использованием Java ProcessBuilder не интерполирует переменные (выводит строку «$ PATH») - PullRequest
4 голосов
/ 21 февраля 2012

Я хочу отобразить переменную 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, не найденную для одного из моих модульных тестов. Я использую этот хак / трюк для изменения моего PATH и проверяя результат processBuilder.environment() и, конечно же, переменная PATH, передаваемая процессу, не должна позволять находить сортировку (я пробовал пустой строка, а также случайный путь). Я хотел бы посмотреть, делает ли оболочка что-нибудь смешное и исправляет резервную копию PATH, которую я пытаюсь уничтожить.

1 Ответ

4 голосов
/ 21 февраля 2012

$PATH - это синтаксис, используемый в bash (и других оболочках) для ссылки на переменную среды PATH. Поскольку echo выполняется с использованием ProcessBuilder, а не bash, неудивительно, что он не печатает содержимое переменной среды.

Вы должны либо получить содержимое переменной среды из Java и передать его в качестве аргумента внешнему процессу, либо выполнить программу, способную правильно интерпретировать синтаксис $PATH (например, * 1009). *).


Как указано в вашем комментарии ниже,

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

действительно печатает содержимое переменной окружения PATH.

...