Если бы я хотел запустить две отдельные команды в одной строке, я мог бы сделать это:
cd /home; ls -al
или это:
cd /home && ls -al
И я получаю такие же результаты. Однако что происходит в фоновом режиме с этими двумя методами? В чем их функциональная разница?
В ;
просто отделяет одну команду от другой. В &&
говорит, что следующую команду следует выполнять только в том случае, если предыдущая была успешной
cd /home; ls -al
Это будет cd /home
и даже если cd
команда не работает (/home
не существует, у вас нет разрешения на его прохождение и т. д.), он запустится ls -al
.
cd /home && ls -al
Это запустит только ls -al
если cd /home
Был успешен.
a && b
если а возвращает нулевой код выхода, затем б выполняется.
a || b
если а возвращает ненулевой код выхода, тогда б выполняется.
a ; b
а выполняется, а затем б выполняется.
cd /fakedir; ls -al
Работает ls
в текущем каталоге, потому что cd /fakedir
завершится ошибкой, и оболочка проигнорирует статус выхода, который не равен нулю.
cd /fakedir && ls -al
Поскольку &&
оператор продолжит работу только в том случае, если предыдущая команда завершилась нормально (нулевой статус), нет ls
операция будет выполнена.
Есть и другие операторы, например &
который будет фоновым процессом. Хотя его часто помещают в конец команды, его можно поместить в середину цепочки.
Вы также можете объединить их вместе как if..then..else
для объединения логики команд.
пример:
ls file.ext && echo "file exists" || echo "file does not exist"