Обычно я использую ;
для объединения нескольких команд в строке, но некоторые люди предпочитают &&
. Есть ли разница? Например, cd ~; cd -
и cd ~ && cd -
, кажется, делают одно и то же. Какая версия более переносима, например. будет поддерживаться подмножеством bash, таким как оболочка Android или около того?
Bash/sh - разница между && и ;
Ответы (7)
Если предыдущая команда не удалась с ;
, запустится вторая.
А вот с &&
второй не запустится.
Это «ленивый» логический операнд «И» между операциями.
;
или &&
? Или вы оба имеете в виду?
- person Shayan; 29.08.2019
&&
.
- person peterchaula; 29.08.2019
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 *
в безопасности... ;)
rm -rf /tnp/test
- person melvynkim; 08.03.2014
rm /tnp/test/ -rf
, чтобы предотвратить смертельный ввод промаха
- person radrow; 01.06.2018
В cmd1 && cmd2
cmd2
выполняется только в случае успеха cmd1
(возвращает 0).
В cmd1 ; cmd2
cmd2
выполняется в любом случае.
Обе конструкции являются частью POSIX-совместимой оболочки.
&&
означает выполнение следующей команды, если предыдущая завершилась со статусом 0. В противном случае используйте ||
, т.е. будет выполняться, если предыдущая команда завершается со статусом, не равным 0 ;
выполняется всегда.
Очень полезно, когда вам нужно выполнить определенное действие в зависимости от того, завершилась ли предыдущая команда успешно или нет.
Команды, разделенные ;
, выполняются последовательно независимо от статуса их выполнения.
С &&
вторая команда выполняется только в случае успешного завершения первой (возвращает статус выхода 0).
Это описано на справочной странице bash в разделе Lists
. Я ожидаю, что любая Unix-подобная оболочка будет поддерживать оба этих оператора, но я не знаю конкретно об оболочке Android.
&&
допускает условное выполнение, в то время как ;
всегда выполняет вторую команду.
Например, command1 && command2
, command2
будут выполняться только тогда, когда command1
завершается с exit 0
, сигнализируя, что все прошло хорошо, в то время как в command1 ; command2
вторая команда всегда будет выполняться независимо от результата command1
.
&& является логическим И в bash. В Bash предусмотрена краткая оценка логического И. Эта идиома является более простым способом выражения следующего:
cmd1;rc=$?
if [ $rc -eq 0 ]; then
cmd2
fi
В то время как ; версия просто:
cmd1
cmd2