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

136

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

psihodelia
источник

Ответы:

193

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

Но со &&вторым не побежишь.

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

Ignar
источник
2
Другими словами, он имеет поведение при коротком замыкании
peterchaula
@peter Какой? ;Один или &&один? Или ты имеешь ввиду оба?
Шаян
@ Шаян &&.
peterchaula
57

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

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

jm666
источник
26
Чтобы быть безопаснее, я бы использовалrm -rf /tnp/test
melvynkim
5
Чтобы быть еще безопаснее, лучше использовать, rm /tnp/test/ -rfчтобы не допустить смертельного мискиск
Radrow
22

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

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

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

Паскаль Куок
источник
11

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

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

Фредрик Пихл
источник
5

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

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

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

Дейв Коста
источник
2
Вот ссылка на руководство по bash: gnu.org/software/bash/manual/bashref.html#Lists
Гленн Джекман
3

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

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

завивать волосы щипцами
источник
1

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


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

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


cmd1
cmd2
frankc
источник