1.Вызов команд Unix:
Вам просто нужно вызвать оболочку Unix (например, bash, поставляемую с Cygwin) вместо cmd
.
bash -c "ls -la"
.Конечно, если ваша команда является внешней программой, вы можете просто вызвать ее напрямую:
ls -la
При запуске из Java лучше использовать вариант, который принимает строковый массив, так какJava не позволяет ему анализировать, чтобы увидеть, где аргументы начинаются и останавливаются:
Process p =
Runtime.getRuntime().exec(new String[]{"C:\\cygwin\\bin\\bash.exe",
"-c", "ls -la"},
new String[]{"PATH=/cygdrive/c/cygwin/bin"});
Сообщение об ошибке в вашем примере (ls: command not found
), кажется, показывает, что ваш bash не может найти ls
команда.Возможно, вам нужно поместить его в переменную PATH (см. Выше, как это сделать из Java).
Возможно, вместо /cygdrive/c/cygwin/bin
, правильное имя каталога будет /usr/bin
.
(Здесь все немного сложнее из-за необходимости везде соединять соглашения Unix и Windows.)
Простую команду ls
можно назвать так:
Process p = Runtime.getRuntime().exec(new String[]{"C:\\cygwin\\bin\\ls.exe", "-la"});
2.Вызов нескольких команд:
Существует два основных способа вызова нескольких команд в одной оболочке:
- , передавая их все сразу в оболочку;или
- , передавая их интерактивно в оболочку.
Для первого способа просто введите несколько команд в качестве аргумента опции -c
, разделенных ;
или \n
(перевод строки), например:
bash -c "cd /bin/ ; ls -la"
или из Java (адаптируя приведенный выше пример):
Process p =
Runtime.getRuntime().exec(new String[]{"C:\\cygwin\\bin\\bash.exe",
"-c", "cd /bin/; ls -la"},
new String[]{"PATH=/cygdrive/c/cygwin/bin"});
Здесь оболочка будет анализировать командную строку как и выполнять ее каксценарий.Если он содержит несколько команд, все они будут выполнены, если по какой-либо причине оболочка не завершит работу (например, команда exit
).(Я не уверен, что Windows cmd
работает аналогичным образом. Пожалуйста, протестируйте и сообщите.)
Вместо передачи команд bash (или cmd или любой другой оболочки, которую вы используете) командамВ командной строке вы можете передать их через поток ввода Process.
- Оболочка, запущенная в «режиме ввода» (например, та, которая не получила ни опции
-c
, ни аргумента файла сценария оболочки), будетчитать ввод из потока и интерпретировать первую строку как команду (или несколько). - Затем она выполнит эту команду.Сама команда может прочитать больше входных данных из потока, если она этого захочет.
- Затем оболочка прочитает следующую строку, интерпретирует ее как команду и выполнит.
- (В некоторых случаяхshell должен читать более одной строки, например, для длинных строк или составных команд, таких как циклы if или.)
- Это будет продолжаться до конца потока (например, stream.close () на вашей стороне).) или выполнение явной команды
exit
(или некоторые другие причины для выхода).
Вот пример для этого:
Process p = Runtime.getRuntime().exec(new String[]{"C:\\cygwin\\bin\\bash.exe", "-s"});
InputStream outStream = p.getInputStream(); // normal output of the shell
InputStream errStream = p.getInputStream(); // error output of the shell
// TODO: start separate threads to read these streams
PrintStream ps = new PrintStream(p.getOutputStream());
ps.println("cd /bin/");
ps.println("ls -la");
ps.println("exit");
ps.close();