Я только что задал вопрос о разветвлении процесса, чтобы уснуть на заднем плане.
Запись, которую я придумал, выглядит следующим образом:
sleep 10 && echo "hello world" &
Этот ответ на другой вопрос использует другой формат.
( sleep 10 ; echo "hello world" ) &
Я знаю, что &&
позволяет запускать второй процесс, только если первый возвращает true. Может ли сон провалиться? Есть ли ситуация, когда я должен предпочесть одно другому?
shell
background-process
sleep
Baarn
источник
источник
Ответы:
Сон может потерпеть неудачу, если он прекращается во время выполнения:
Поскольку sleep - это внешний исполняемый файл, также возможно, что вызовы fork или exec могут завершиться ошибкой, что также приведет к тому, что bash сгенерирует код ошибки> 0.
источник
a; b
всегда запускает вторую команду после первой, тогдаa && b
как вторая выполняет только в том случае, если первая успешна, т. е. только если первая команда возвращает статус 0.sleep
всегда возвращает статус 0, за исключением случаев, когда он прерывается сигналом, в этом случае статус равен 128 + номер сигнала. (Состояние также может быть 126 или 127, еслиsleep
команда не существует или программа не может запуститься из-за нехватки ресурсов, но вы вряд ли столкнетесь с этими случаями.)Таким образом, вы должны использовать
;
или в&&
зависимости от того, что вы хотите случиться, если сон прерывается:sleep 10; echo hello
печатает сообщение через 10 секунд (меньше, еслиsleep
его убивает сигнал);sleep 10 && echo hello
печатает сообщение через 10 секунд, но ничего не печатает, еслиsleep
его убил сигнал.источник
Вы должны предположить, что любая команда может потерпеть неудачу по разным причинам, даже если сбой сна действительно маловероятен.
означает фоновый сон и выполнение эхо после процесса сна, но если сон не удастся, эхо все равно будет работать, см. полное объяснение
означает, что вам нужно дождаться окончания сна, прежде чем что-то повторить, и если эхо не сработает, процесс остановится, но вся команда также будет фоновой. см полное объяснение
Заключение
Первый синтаксис - это сценарий оболочки, что означает, что он рассматривает инструкции отдельно в виде списка.
Второй параметр использует && означает AND, поэтому, если вы используете его, если первая команда потерпит неудачу, вторая не будет выполнена.
Это просто другое поведение при обработке ошибок.
источник