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


136

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

Ответы:


193

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

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

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


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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.