Bash / sh - різниця між && і;


136

Я зазвичай використовую ;для об'єднання декількох команд у рядку, але деякі люди вважають за краще &&. Чи є різниця? Наприклад, cd ~; cd -і, cd ~ && cd -здається, робить те саме. Яка версія більш портативна, наприклад, буде підтримуватися bash-підмножина, наприклад оболонка Android?

Відповіді:


193

Якщо попередня команда не вдалася, ;друга запуститься.

Але з &&другим не біжить.

Це "ледачий" логічний "І" операнд між операціями.


2
Іншими словами, він має коротке замикання
петершаула

@peter Який? Той ;чи той &&? Або ти маєш на увазі обох?
Шаян

@Shayan, the &&.
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
мельвінкім

5
Щоб бути ще безпечнішим, краще використовувати rm /tnp/test/ -rfдля запобігання смертельному введенню пропуску
radrow

22

В cmd1 && cmd2, cmd2виконується лише у випадку cmd1успіху (повертає 0).

В cmd1 ; cmd2, cmd2виконується в будь-якому випадку.

Обидві конструкції є частиною оболонки, сумісної з POSIX.


11

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

Дуже корисно, коли вам потрібно виконати певну дію, залежно від того, попередня команда закінчилася ОК чи ні.


5

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

З &&, друга команда виконується лише в тому випадку, якщо перша успішно виконана (повертає статус виходу 0).

Це висвітлено у баш-manpage під Lists. Я б очікував, що будь-яка оболонка, схожа на Unix, підтримує обох цих операторів, але я не знаю конкретно про оболонку Android.


2
Ось посилання на посібник з bash: gnu.org/software/bash/manual/bashref.html#Lists
glenn jackman

3

&&дозволяє умовне виконання, хоча ;завжди виконується друга команда.

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


1

&& логічно І в баш. Bash має коротке замикання логічним AND. Ця ідіома є більш простим способом вираження наступного:


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

В той час, як; версія лише:


cmd1
cmd2
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.