Чи є різниця між тим, як два амперсанда і напівкрапка працюють в баші?


71

Якби я хотів запустити дві окремі команди в одному рядку, я міг би це зробити:

cd /home; ls -al

або це:

cd /home && ls -al

І я отримую ті ж результати. Однак що відбувається на задньому плані з цими двома методами? У чому полягає функціональна різниця між ними?

Відповіді:


88

;Просто відокремлює одну команду від іншої. &&Каже тільки запустити наступну команду , якщо попередній був успішним

cd /home; ls -al

Це буде, cd /homeі навіть якщо cdкоманда не вдасться ( /homeне існує, у вас немає дозволу перейти її тощо), вона запуститься ls -al.

cd /home && ls -al

Це запуститься лише в тому ls -alвипадку, якщо cd /homeуспішно виконано .


2
використання ; - це справді небезпечно (принаймні, з командою rm), наприклад cd /some/dir; rm -fr ./*. Тож при такій руйнівній операції ви повинні бути впевнені, що ви знаходитесь у потрібному місці, перш ніж виконувати rm. Правильна командаcd /some/dir && rm -fr ./*
ALex_hha

70
a && b

якщо а повертає нуль код виходу, то Ь виконується.

a || b

якщо повертає код не дорівнює нулю виходу, то Ь виконується.

a ; b

a виконується, а потім виконується b .


16
cd /fakedir; ls -al

Запускається lsв поточному каталозі, оскільки cd /fakedirне вдасться, і оболонка буде ігнорувати статус виходу, який не дорівнює нулю.

cd /fakedir && ls -al

Оскільки &&оператор буде продовжуватись лише тоді, коли попередня команда нормально вийшла (стан нульовий), жодна lsоперація не буде виконуватися.

Є й інші оператори, такі, як &цей процес буде фоновим. Хоча часто розміщується в кінці команди, її можна помістити посередині ланцюга.


4

Ви також можете приєднатися до них разом , як if..then..elseдля побудови ланцюжка команд логіки.

приклад:

ls file.ext && echo "file exists" || echo "file does not exist"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.