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

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

Ответ 1

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

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

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

Ответ 2

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

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 * является безопасным...;)

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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


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

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


cmd1
cmd2