Назад | Перейти на главную страницу

Есть ли разница между двумя амперсандами и точкой с запятой в bash?

Если бы я хотел запустить две отдельные команды в одной строке, я мог бы сделать это:

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"