Какой из них лучше: использование; или && для выполнения нескольких команд в одной строке?

284

В учебниках и инструкциях я часто вижу комбинации команд. Например,

sudo apt-get update && sudo apt-get install pyrenamer

Кажется, что существует четыре возможных соединителя: & , && , || и ; . Хотя соединитель & мне понятен (он отправляет процесс на задний план и оставляет доступный терминал), неясно, какая разница между && и ; . И я не знал о || до комментария Kaya.

Следующие вопросы касаются разницы между двумя разъемами, но делают это главным образом в комментариях:

Итак, вот несколько связанных вопросов:

  1. В чем разница между ; и && ?
  2. Когда вы должны использовать их соответственно? Было бы неплохо увидеть некоторые варианты использования: если я хочу запустить команду, а затем после ее завершения мой компьютер, какой соединитель выбрать, я должен выбрать?
  3. Каковы их преимущества и опасности ? Роби Басак упоминает в комментарии этот ответ , что команда вроде cd /somewhere_else; rm -Rf * может иметь деструктивные последствия, если, например, первый элемент в цепочке команд терпит неудачу.
  4. Если это необходимо, откуда они взялись?
задан don.joey 20.08.2013 в 18:41
источник

4 ответа

515

Cheatsheet:

A; B    Run A and then B, regardless of success of A
A && B  Run B if A succeeded
A || B  Run B if A failed
A &     Run A in background.
    
ответ дан Jack 20.10.2014 в 13:02
источник
73

&& запускает только вторую команду, если первый из них вышел из состояния 0 (был успешным). ; запускает обе команды, даже если первый из них выходит с нулевым статусом.

Ваш пример с && может быть эквивалентно перефразирован как

if sudo apt-get update ; then
    sudo apt-get install pyrenamer
fi
    
ответ дан choroba 20.08.2013 в 18:46
27

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

используя && выполнить вторую команду только тогда, когда первая команда выполнена успешно (статус 0).

Оба используются в разной перспективе. Как для более длительного процесса, скажем, для установки вам необходимо скомпилировать и установить его. вы должны make && make install . Таким образом, установка будет работать только в том случае, если make выполнено успешно.

Итак, для зависимых команд вы должны использовать &&

Wring bash или команды с независимыми командами используют ;

Итак, если вы хотите выключить компьютер, даже первое задание не помогло использовать ; , но если вы хотите, чтобы при успешном завершении первого задания инициировали выключение, используйте &&

    
ответ дан Web-E 20.08.2013 в 18:50
11

a ; b будет работать b независимо от состояния выхода a. a && b будет работать b только в том случае, если преуспел.

Это необходимо и достаточно для ответа на первые три вопроса. В частности, 2 слишком широк и не может быть дан «один» окончательный ответ - наилучшим выбором является выбор по каждому случаю.

Что касается четвертого вопроса: Они синтаксис Bash .

Не существует внутренней опасности при использовании. Опять же, определение выше достаточно. Это означает, что вы будете писать && , если b имеет непреднамеренные эффекты, если a не удалось. Нет необходимости в дополнительных правилах или объяснениях, ИМХО.

    
ответ дан ignis 20.08.2013 в 23:05