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


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

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

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

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

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

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

332
2017-08-20 16:41


происхождения


Существует еще один разъем, с которым вы, возможно, не сталкивались: ||такой же как && за исключением того, что он выполняет только вторую команду, если первая из них вышла с ненулевым (неудачным) статусом. - Kaya
Также обратите внимание, что запуск скрипта с помощью set -e остановит сценарий при сбое, как если бы все команды были связаны с &&, - choroba
stackoverflow.com/questions/3573742/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
Никто не ответил Qn 4 ... Я подозреваю, что поведение && и || был вдохновлен языком программирования C. В случае (x && y), если x оценивается как false, все выражение должно быть ложным, чтобы компилятор мог оптимизировать оценку y, если это было дорого. Современные стандарты C и C ++ требовать эта оптимизация, поэтому программы могут с уверенностью предположить, что y не будет оцениваться, если x является ложным. Например, (ptr && ptr-> days> 31) не будет разбиваться, даже если ptr равно null. Также в C, утверждения заканчиваются; независимо от того, существует ли другое заявление в той же строке или нет. - Kevin


ответы:


Cheatsheet:

A; B    # Run A and then B, regardless of success of A
A && B  # Run B if and only if A succeeded
A || B  # Run B if and only if A failed
A &     # Run A in background.

608
2017-10-20 11:02



И, конечно, A & B &: Запустите A в фоновом режиме, затем запустите B в фоновом режиме (независимо от успеха) и верните управление в оболочку. Это часто работает примерно так же, как и запуск обоих процессов одновременно. - Limited Atonement
можно ли сказать: запустите a в фоновом режиме, а затем b в фоновом режиме, только если сработало? ( Я полагаю &&& ?) - user230910
@ user230910: это будет (A && B) &, - leftaroundabout
Можете ли вы ссылаться на авторитетный документ для этого ?. - Jaime Hablutzel
@Jack Когда выполняется от Cronjob, это не совсем соответствует этому правилу, любая идея почему? Для файла python - CodeGuru


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

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

if sudo apt-get update ; then
    sudo apt-get install pyrenamer
fi

77
2017-08-20 16:46



Благодарю. Я обновил вопрос, чтобы убедиться, что различные подзапросы легко различимы. - don.joey
@Private: вы должны использовать ; если второй команде не нужен предыдущий, чтобы преуспеть. - choroba


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

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

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

Поэтому для зависимых команд вы должны использовать &&

Wring bash или команды с независимыми командами ; 

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


28
2017-08-20 16:50



Благодарю. Мне нравится последний случай использования, который вы представляете. Я обновил вопрос. - don.joey


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

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

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

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


13
2017-08-20 21:05