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

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

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

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

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

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

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

4 ответа


591

Cheatsheet:

A; B # Run A, а затем B, независимо от успеха A
A & & B # Запустить B тогда и только тогда, когда A удалось
A || B # Выполнить B тогда и только тогда, когда A не удалось
A & # Выполнить A в фоновом режиме.
ответил Jack 20 +04002014-10-20T15:02:21+04:00312014bEurope/MoscowMon, 20 Oct 2014 15:02:21 +0400 2014, 15:02:21
76

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

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

, если sudo apt-get update; тогда
    sudo apt-get install pyrenamer
фи
ответил choroba 20 PM00000080000005031 2013, 20:46:50
28

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

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

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

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

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

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

ответил Web-E 20 PM00000080000005031 2013, 20:50:50
12

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

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

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

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

ответил ignis 21 AM00000010000003931 2013, 01:05:39

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132