Bash/sh - разница между && и ;

Обычно я использую ; для объединения нескольких команд в строке, но некоторые люди предпочитают &&. Есть ли разница? Например, cd ~; cd - и cd ~ && cd -, кажется, делают одно и то же. Какая версия более переносима, например. будет поддерживаться подмножеством bash, таким как оболочка Android или около того?


person psihodelia    schedule 27.05.2011    source источник


Ответы (7)


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

А вот с && второй не запустится.

Это «ленивый» логический операнд «И» между операциями.

person ignar    schedule 27.05.2011
comment
Другими словами, у него поведение короткого замыкания. - person peterchaula; 12.07.2018
comment
@peter какой? ; или &&? Или вы оба имеете в виду? - person Shayan; 29.08.2019
comment
@Шаян, &&. - person peterchaula; 29.08.2019
comment
Значит, вы бы предпочли запустить sudo apt update && sudo apt upgrade, а не sudo apt update; sudo apt upgrade, верно? - person Vthechamp; 03.02.2021

Я использую &&, потому что давным-давно на соседнем компьютере:

root# pwd
/
root# cd /tnp/test; rm -rf *
cd: /tnp/test: No such file or directory
...
... and after a while ...
...   
^C

но не помогло... ;)

cd /tnp/test && rm -rf * в безопасности... ;)

person jm666    schedule 27.05.2011
comment
Чтобы быть в безопасности, я бы использовал rm -rf /tnp/test - person melvynkim; 08.03.2014
comment
Чтобы быть еще безопаснее, лучше использовать rm /tnp/test/ -rf, чтобы предотвратить смертельный ввод промаха - person radrow; 01.06.2018

В cmd1 && cmd2 cmd2 выполняется только в случае успеха cmd1 (возвращает 0).

В cmd1 ; cmd2 cmd2 выполняется в любом случае.

Обе конструкции являются частью POSIX-совместимой оболочки.

person Pascal Cuoq    schedule 27.05.2011

&& означает выполнение следующей команды, если предыдущая завершилась со статусом 0. В противном случае используйте ||, т.е. будет выполняться, если предыдущая команда завершается со статусом, не равным 0 ; выполняется всегда.

Очень полезно, когда вам нужно выполнить определенное действие в зависимости от того, завершилась ли предыдущая команда успешно или нет.

person Fredrik Pihl    schedule 27.05.2011

Команды, разделенные ;, выполняются последовательно независимо от статуса их выполнения.

С && вторая команда выполняется только в случае успешного завершения первой (возвращает статус выхода 0).

Это описано на справочной странице bash в разделе Lists. Я ожидаю, что любая Unix-подобная оболочка будет поддерживать оба этих оператора, но я не знаю конкретно об оболочке Android.

person Dave Costa    schedule 27.05.2011
comment
Вот ссылка на руководство по bash: gnu.org/software/bash/ руководство/bashref.html#Списки - person glenn jackman; 27.05.2011

&& допускает условное выполнение, в то время как ; всегда выполняет вторую команду.

Например, command1 && command2, command2 будут выполняться только тогда, когда command1 завершается с exit 0, сигнализируя, что все прошло хорошо, в то время как в command1 ; command2 вторая команда всегда будет выполняться независимо от результата command1.

person Marcel    schedule 27.05.2011

&& является логическим И в bash. В Bash предусмотрена краткая оценка логического И. Эта идиома является более простым способом выражения следующего:


cmd1;rc=$?
if [ $rc -eq 0 ]; then
   cmd2
fi

В то время как ; версия просто:


cmd1
cmd2
person frankc    schedule 27.05.2011