Bash / sh - разница между && и; - PullRequest
114 голосов
/ 27 мая 2011

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

Ответы [ 7 ]

165 голосов
/ 27 мая 2011

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

Но с && вторая не будет запущена.

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

51 голосов
/ 27 мая 2011

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

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

19 голосов
/ 27 мая 2011

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

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

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

8 голосов
/ 27 мая 2011

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

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

5 голосов
/ 27 мая 2011

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

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

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

3 голосов
/ 27 мая 2011

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

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

1 голос
/ 27 мая 2011

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


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

Принимая во внимание, что; версия просто:


cmd1
cmd2
...