Запустить другую команду, когда предыдущая команда завершится [дубликат]

Сегодня я открыл gnome-terminal и написал

ls && sleep 4 && gnome-terminal

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

После этого в следующий раз я набрал новую команду

ls -lR && sleep 4 && gnome-terminal

Команда ls -lR завершилась через 3 секунды, но после этого ни одна из команд sleep 4 и ] gnome-terminal работал успешно.

В чем проблема?

10
задан 28 January 2019 в 12:46

2 ответа

&& средства выполнить его, если предыдущая команда была успешна. В 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
  • ;: Выполненный безусловно
  • ||: Выполненный если предыдущая команда, из которой выходят с ненулевым статусом выхода.
  • &: Выполненный обе команды в параллели, первое в фоне и второй на переднем плане.
24
ответ дан 23 November 2019 в 04:15

Команда 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).
12
ответ дан 23 November 2019 в 04:15

Другие вопросы по тегам:

Похожие вопросы: