В чем разница между двойным амперсандом (&&) и точкой с запятой (;) в Linux Bash?

112

В чем разница между амперсандом и точкой с запятой в Linux Bash ?

Например,

$ command1 && command2

против

$ command1; command2
Стив К
источник
6
Я ответил на это здесь: superuser.com/a/619019/107862
Etan Reisner
9
Что касается не по теме, то в прошлый раз, когда я проверил, bash все еще был языком программирования, но раньше я ошибался и это могло быть немного сухофруктов.
Стив К.
Это так, и если бы вы задали вопрос о конкретном поведении или правильном способе сделать определенное действие, это, безусловно, было бы по теме. Это относится к более серой категории «вопроса о синтаксисе языка», что, на мой взгляд, не так явно относится к вопросу «программирования».
Этан Рейснер
4
bash в некотором роде сухой и в некотором смысле сладкий. В конце концов, это довольно приятно и легко усваивается. Однако его нелегко украсть у младенцев.
code_monk

Ответы:

139

&&Оператор является логическим оператором И: если левая сторона возвращает ненулевое состояние выхода, оператор возвращает этот статус и не оценивает правую стороны (его короткое замыкание), в противном случае он правая стороны и возвращает статус выхода . Обычно это используется, чтобы убедиться, что command2он запускается только в случае command1успешного выполнения.

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

cdhowie
источник
6
двойной амперсанд &&отличается от одиночного амперсанда &в bash?
Чарли Паркер
16
@CharlieParker &заставляет команду запускаться в фоновом режиме, так что да. «Запускать это в фоновом режиме» сильно отличается от «запускать эту следующую команду, только если эта другая успешно».
cdhowie
Команда 2 будет запускать только команду 1 вернула нулевой статус выхода, что означает, что она успешно завершена ..
Ник
Все ;еще ждет завершения первой команды?
RFII
@rfii Да, но он выполняет вторую команду независимо от того, была ли первая команда успешной. a;bозначает «беги, aа потом беги b». a&&bозначает «запускать a, а затем запускать bтолько в случае aуспеха».
cdhowie,
33

команда1 && команда2

command1 && command2выполняется, command2если (и только если) command1выполнение завершается успешно. На жаргоне Unix это означает, что код выхода / код возврата равен нулю.

command1; command2

command1; command2выполняется command2после выполнения command1, последовательно. Неважно, были ли команды успешными или нет.

Jimm-сл
источник
6

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

На самом деле происходит следующее: когда первая программа возвращает ненулевой код выхода, ANDоценивается все, FALSEи вторая команда не выполняется. Последний просто выполняет их обоих по порядку.

Danstahr
источник