В чем разница между && и; когда разветвляешься на задний план?

8

Я только что задал вопрос о разветвлении процесса, чтобы уснуть на заднем плане.
Запись, которую я придумал, выглядит следующим образом:

sleep 10 && echo "hello world" &

Этот ответ на другой вопрос использует другой формат.

( sleep 10 ; echo "hello world" ) &

Я знаю, что &&позволяет запускать второй процесс, только если первый возвращает true. Может ли сон провалиться? Есть ли ситуация, когда я должен предпочесть одно другому?

Baarn
источник

Ответы:

12

Сон может потерпеть неудачу, если он прекращается во время выполнения:

$ sleep 2
$ echo "$?"
0
$ sleep 2
^C
$ echo "$?"
130

Поскольку sleep - это внешний исполняемый файл, также возможно, что вызовы fork или exec могут завершиться ошибкой, что также приведет к тому, что bash сгенерирует код ошибки> 0.

Крис Даун
источник
5

a; bвсегда запускает вторую команду после первой, тогда a && bкак вторая выполняет только в том случае, если первая успешна, т. е. только если первая команда возвращает статус 0.

sleepвсегда возвращает статус 0, за исключением случаев, когда он прерывается сигналом, в этом случае статус равен 128 + номер сигнала. (Состояние также может быть 126 или 127, если sleepкоманда не существует или программа не может запуститься из-за нехватки ресурсов, но вы вряд ли столкнетесь с этими случаями.)

Таким образом, вы должны использовать ;или в &&зависимости от того, что вы хотите случиться, если сон прерывается:

  • sleep 10; echo helloпечатает сообщение через 10 секунд (меньше, если sleepего убивает сигнал);
  • sleep 10 && echo helloпечатает сообщение через 10 секунд, но ничего не печатает, если sleepего убил сигнал.
Жиль "ТАК - перестань быть злым"
источник
3

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

( sleep 10 ; echo "hello world" ) &

означает фоновый сон и выполнение эхо после процесса сна, но если сон не удастся, эхо все равно будет работать, см. полное объяснение

sleep 10 && echo "hello world" &

означает, что вам нужно дождаться окончания сна, прежде чем что-то повторить, и если эхо не сработает, процесс остановится, но вся команда также будет фоновой. см полное объяснение

Заключение
Первый синтаксис - это сценарий оболочки, что означает, что он рассматривает инструкции отдельно в виде списка.
Второй параметр использует && означает AND, поэтому, если вы используете его, если первая команда потерпит неудачу, вторая не будет выполнена.

Это просто другое поведение при обработке ошибок.

Kiwy
источник
@terdon Спасибо за редактирование, мой пост был действительно ужасно написан
Kiwy