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


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

7 98

7 ответов:

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

но с && второй не будет работать.

это "ленивый" логический " и " операнд между операциями.

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

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 * безопасно... ;)

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

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

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

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

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

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

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

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

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

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

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


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

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


cmd1
cmd2