Разница между выполнением внутренних и внешних команд Unix в Java - PullRequest
1 голос
/ 18 февраля 2009

Почему внутренние команды unix (cd, pwd и т. Д.) Нельзя запускать непосредственно в java, например, внешние команды (chmod, chown и т. Д.), Используя Runtime.getRuntime (). Exec ()?

Пожалуйста, помогите с объяснением.

Ответы [ 4 ]

7 голосов
/ 18 февраля 2009

Потому что они встроены в оболочку, а не являются программами сами по себе.

Самое простое, что нужно сделать, это вызвать оболочку и передать команду с помощью опции -c:

> bash -c pwd
/home/foo/bar/baz

... или на Java:

Runtime.getRuntime().exec("bash -c pwd")

... или, в более общем случае:

Runtime.getRuntime().exec(new String[]{"bash", "-c", command});

Нам нужно использовать вариант String [], в противном случае наша команда будет искажена StringTokenizer, если она содержит какие-либо пробелы.

2 голосов
/ 18 февраля 2009

Другие указали основную причину, но на самом деле они не объяснили , почему это должно быть так.

Команды оболочки cd и pwd являются внутренними для оболочки, поскольку они влияют или сообщают о внутреннем состоянии оболочки.

Оба приведенных здесь примера работают с «рабочим каталогом», который является частью внутреннего состояния оболочки, хотя переменная окружения PWD также обновляется с помощью тонкой информации.

Чтобы добиться того же эффекта в вашей программе, вам нужно изменить или получить доступ к внутреннему состоянию вашего процесса. Получение и установка состояния переменной окружения PWD было бы разумным, если не совсем подходящим способом, для достижения этой цели.

2 голосов
/ 18 февраля 2009

Возможно, вы захотите прочитать «Когда Runtime.exec () не будет».

2 голосов
/ 18 февраля 2009

Java нужен исполняемый файл для выполнения. Вот почему встроенные команды оболочки (такие как cd, bg, alias) не работают с Java. Встроенные команды не являются действительными исполняемыми файлами, а просто интерпретируются оболочкой, когда оболочка встречает их в командной строке или в сценарии.

Возможно, вам удастся обойти это, написав сценарий оболочки, содержащий встроенную команду, а затем выполнив сценарий оболочки из приложения Java.

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