2016-03-17 4 views
3

Я хотел бы запустить несколько команд в командной строке.Несколько команд в одной строке в Linux

В обычном случае это просто:

#cd /home && ls && echo "OK" 
root web support 
OK 

Однако, когда одна из команд заканчивается сама по & это не похоже на работу:

#killall vsftpd && /usr/sbin/vsftpd & && echo "OK" 
-sh: syntax error: unexpected "&&" 
OK 

Я пытался без одиночный трейлинг &, но это, очевидно, останавливает обработку последнего echo. Просто для удовольствия попробовал тройку &, но это также возвращает ошибку.

Так что мой вопрос; как я могу получить

killall vsftpd 
/usr/sbin/vsftpd & 
echo "OK" 

выполнен на одной линии?

+1

Возможный дубликат [Как выполнить несколько фоновых команд в bash в одной строке?] (Http://stackoverflow.com/questions/14612371/how-do-i-run-multiple-background-commands-in -bash-in-a-single-line) – FrenchFalcon

ответ

6

Во-первых, если вы хотите запустить несколько команд в одной строке, разделив их на ;:

cmd1 ; cmd2 ; cmd3 

&& является логическим и оператора. Если вы выдаете

cmd1 && cmd2 

cmd2 будет работать только тогда, когда cmd1 удалось. Это важно упомянуть (см. Также ниже).


Если вы используете & для запуска команды в фоновом режиме, просто добавьте следующую команду без ; разделителя:

cmd1 & cmd2 

& не является логическим оператор в этом случае, он говорит Баш на запустить cmd1 в фоновом режиме.

В вашем случае, командная строка нуждается в синтаксически выглядеть следующим образом:

killall vsftpd && /usr/sbin/vsftpd & echo "OK" 

Однако, я думаю, вы на самом деле имел в виду это:

killall vsftpd ; /usr/sbin/vsftpd & echo "OK" 

, потому что в противном случае вы не смогли бы начать процесс если он еще не запущен, поскольку killall вернет ненулевой код возврата.

Даже имея этот код довольно хрупкий. Я предлагаю использовать ваши операционные системы для запуска vsftp в качестве демона. Я имею в виду объекты вроде команды start-stop-daemon.

+0

Спасибо, что указали разницу между '&&' и ';'. Похоже, в большинстве случаев ';' предпочтительнее выше '&&'. – EDP

1

Вы можете инкапсулировать команды (или последовательности команд) в скобках, например:

# killall vsftpd && (/usr/sbin/vsftpd &) && echo "OK" 

Однако, это не имеет особого смысла семантически как && маркер означает «выполнить последующую команду, если предыдущая команда успешно "(Т.е., возвращаемое значение 0), а одиночный & помещает команду, предшествующую ей, в фоновый режим (сразу же следуя следующей команде), что всегда дает успех.

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

Смежные вопросы