Запустите команду Linux через Java. - PullRequest
0 голосов
/ 29 июля 2011

Я хочу запустить команду nm в Linux через Java.

Я попробовал этот код:

command = "nm -l file1.o > file1.txt";
Process p = Runtime.getRuntime().exec(command);

Но это не работает, что не так с кодом?

Ответы [ 3 ]

4 голосов
/ 29 июля 2011

Это не исполняемый файл, на самом деле это скрипт оболочки.

Если вы вызываете оболочку с -c, вы можете выполнить команду:

/bin/sh -c "command > here"
2 голосов
/ 29 июля 2011

Вот что вам нужно сделать:

String command = "nm -l file1.o > file1.txt";
Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", command});

Следующий «простой ответ» НЕ РАБОТАЕТ :

String command = "/bin/sh -c 'nm -l file1.o > file1.txt'";
Process p = Runtime.getRuntime().exec(command);

потому что метод exec(String) наивно разбивает свою строку, используя пробел в качестве разделителя и игнорируя любые кавычки. Таким образом, приведенный выше пример эквивалентен предоставлению следующего списка команд / аргументов.

new String[]{"/bin/sh", "-c", "'nm", "-l", "file1.o", ">", "file1.txt'"};
0 голосов
/ 29 июля 2011

Альтернативой pipe может быть чтение стандартного вывода вашей команды, см. Java exec () не возвращает ожидаемый результат для подключенных к каналу команд для примера.

Вместоперенаправляя вывод, используя "> file.txt", вы прочитали бы любой вывод и записали бы его в StringBuffer или OutputStream или как вам угодно.

Это имело бы преимущество в том, что вы могли бы также прочитать stderr и посмотреть,были ошибки (например, на устройстве не осталось места и т. д.).(вы также можете сделать это, используя «2>», используя ваш подход)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...