Какой из них лучше: использование; или & & выполнить несколько команд в одной строке?
В учебниках и инструкциях я часто вижу комбинации команд. Например,
sudo apt-get update & & & & & sudo apt-get install pyrenamer
Кажется, что существует четыре возможных соединителя: &
, & &
, ||
и ;
. Хотя коннектор &
мне понятен (он отправляет процесс на задний план и оставляет доступным терминал), неясно, в чем разница между & &
и ;
. И я не знал о ||
до комментария Kaya.
Следующие вопросы касаются разницы между двумя разъемами, но делают это главным образом в комментариях:
Итак, вот несколько связанных вопросов:
- В чем разница между
;
и& &
? - Когда вы должны использовать их соответственно? Было бы неплохо увидеть некоторые варианты использования: если я хочу запустить команду, а затем после ее завершения мой компьютер, какой соединитель выбрать, я должен выбрать?
- Каковы их преимущества и опасности ? Роби Басак упоминает в комментарии этот ответ , что команда вроде
cd /something_else; rm -Rf *
может иметь разрушительные последствия, если, например, первый элемент в цепочке команд терпит неудачу. - Если это необходимо, откуда они взялись?
4 ответа
Cheatsheet:
A; B # Run A, а затем B, независимо от успеха A
A & & B # Запустить B тогда и только тогда, когда A удалось
A || B # Выполнить B тогда и только тогда, когда A не удалось
A & # Выполнить A в фоновом режиме.
&
запускает только вторую команду, если первый из них вышел из состояния 0 (был успешно). ;
выполняет обе команды, даже если первый из них выходит с нулевым статусом.
Ваш пример с & &
может быть эквивалентно перефразирован как
, если sudo apt-get update; тогда
sudo apt-get install pyrenamer
фи
Использование ;
будет выполнять команды независимо от того, выполнена ли первая команда или нет.
используя & &
выполнить вторую команду только тогда, когда первая команда выполнена успешно (статус 0).
Оба используются в разной перспективе. Как для более длительного процесса, скажем, для установки вам необходимо скомпилировать и установить его. вы должны make & & make install
. Таким образом, установка будет выполняться, только если make
успешно.
Итак, для зависимых команд вы должны использовать & &
Wring bash или команды с независимыми командами используют ;
Итак, если вы хотите выключить компьютер, даже если первое задание не сработало, используйте ;
, но если вы хотите, чтобы при успешном завершении первого задания инициировали выключение, используйте & &
a; b
будет работать b независимо от состояния выхода a. a & & b
будет запускать b только в том случае, если выполнено.
Это необходимо и достаточно для ответа на первые три вопроса. В частности, 2 слишком широк и не может быть дан «один» окончательный ответ - наилучшим выбором является выбор по каждому случаю.
Что касается четвертого вопроса: Они синтаксис Bash .
Не существует внутренней опасности при использовании. Опять же, определение выше достаточно. Это означает, что вы напишете & &
, если b
имеет непреднамеренные эффекты, если a
не удалось. Нет необходимости в дополнительных правилах или объяснениях, ИМХО.