Яка причина використання && замість; розміщувати команди в одному рядку?


30

Не будучи експертом ні в Linux, ні в Unix, мені цікаво, в чому різниця між цими 2 методами введення 2 команд в одному рядку? Я не бачу різниці у виході в цьому спрощеному прикладі

Pete$date ; time
Sun Mar 17 19:37:20 EDT 2013

real    0m0.000s
user    0m0.000s
sys 0m0.000s

Pete$date &&time
Sun Mar 17 19:37:46 EDT 2013

real    0m0.000s
user    0m0.000s
sys 0m0.000s

Це не викликало проблем - мені просто цікаво ..

Відповіді:


43

&&є логічним 'і'. Перший аргумент оцінюється, а другий оцінюється лише у тому випадку, якщо перший повертає істину. Причина полягає в тому, що "хибне І щось" завжди неправдиве, тому не потрібно оцінювати другий аргумент у цьому випадку.

Тож за допомогою &&переконайтеся, що друга команда не виконується, якщо перша повідомляє про помилку ( trueпредставлена ​​кодом виходу 0, який вказує на те, що помилки не було). На відміну від цього, ;виконує обидві команди, незалежно від результату першої.

Висновок: Пов'язування команд за допомогою &&- корисна звичка. На відміну від ;цього, він не буде виконувати наступні команди, якщо щось пішло не так.


ти маєш на увазі, що це 0означає, trueчи це 0означає правду - є помилка?
Майкл Батлер

1
@MichaelButler: 0означає true. Я додав уточнення.
азимут

26

;

Послідовно виконує команди, незалежно від того, яким був попередній статус виходу:

# sh -c "exit 0" ; echo "2nd command"
2nd command
# sh -c "exit 1" ; echo "2nd command"
2nd command

&&

Логічний І

Виконайте наступну команду, але тільки якщо попередня команда вдалася (статус виходу 0):

# sh -c "exit 0" && echo "2nd command"
2nd command
# sh -c "exit 1" && echo "2nd command"
#

||

Логічний АБО

Виконайте наступну команду, але лише якщо попередня команда не вдалася (статус виходу не був 0):

# sh -c "exit 0" || echo "2nd command"
#
# sh -c "exit 1" || echo "2nd command"
2nd command

6
Також sh -c "exit 0"можна замінити trueна цих прикладах і sh -c "exit 1"на false.
Flimm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.