На этот вопрос уже есть ответ:
Сегодня я открыл gnome-terminal
и написал
ls && sleep 4 && gnome-terminal
, чтобы открыть другой терминал после завершения команды ls
и ждем 4 секунды.
Таким образом, он успешно открыл новый терминал после полного выполнения предыдущих команд (включая спящий режим 4
).
После этого в следующий раз я набрал новую команду
ls -lR && sleep 4 && gnome-terminal
Команда ls -lR
завершилась через 3 секунды, но после этого ни одна из команд sleep 4
и ] gnome-terminal
работал успешно.
В чем проблема?
&&
средства выполнить его, если предыдущая команда была успешна. В Unix, который обычно означает статус выхода 0.
$ ls barfoofba && echo "This will not be echo'd"
ls: cannot access 'barfoofba': No such file or directory
$ ls bar && echo "This will be echo'd"
This will be echo'd
Прежде всего, ls
не успешно выполнялся, таким образом, это вышло с ненулевым статусом выхода, и удар не выполнял вторую команду.
Во втором примере, я ls'd существующий файл, таким образом, ls, из которого выходят с 0 как статус выхода и команда, выполнялся.
Если Вы хотите к командам выполнения безусловно, например, не зависящие от результата первого, можно разделить их с ;
как это
command1; command2; command3
и т.д.
Таким образом можно сделать
ls -lR ; sleep 4 ; gnome-terminal
В дополнение к &&
и ;
Вы имеете ||
который является противоположностью &&
: Только выполните команду, если предыдущая команда перестала работать с ненулевым статусом выхода. Если первая команда успешно выполнится, то следующее не будет выполняться. Если это перестанет работать, то следующее будет выполняться.
Так короче говоря:
&&
: Выполненный если предыдущая команда, из которой выходят с 0 ;
: Выполненный безусловно||
: Выполненный если предыдущая команда, из которой выходят с ненулевым статусом выхода.&
: Выполненный обе команды в параллели, первое в фоне и второй на переднем плане.Команда ls -lR
вышедший со статусом выхода, отличающимся, чем нуль, таким образом, следующие команды не были выполнены. По всей вероятности ls
не могло открыть подкаталог. Этого не произошло в Вашей первой команде, потому что Вы не использовали -R
- опция.
От man bash
:
command1 && command2 command2 is executed if, and only if, command1 returns an exit status of zero.
От man ls
:
Exit status: 0 if OK, 1 if minor problems (e.g., cannot access subdirectory) 2 if serious trouble (e.g., cannot access command-line argument).