Вопрос: Есть ли разница между тем, как две амперсанды и полуколония действуют в bash?


Если бы я хотел запустить две отдельные команды в одной строке, я мог бы сделать это:

cd /home; ls -al

или это:

cd /home && ls -al

И я получаю те же результаты. Однако что происходит в фоновом режиме с помощью этих двух методов? Какова функциональная разница между ними?


66
2018-03-24 20:51


Источник




Ответы:


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

cd /home; ls -al

Это будет cd /home и даже если cd команда не работает (/home не существует, у вас нет разрешения на его перемещение и т. д.), он будет работать ls -al,

cd /home && ls -al

Это приведет только к ls -al если cd /home Был успешен.


84
2018-03-24 20:58



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


a && b

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

a || b

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

a ; b

 выполняется, а затем б выполняется.


68
2018-03-26 01:50





cd /fakedir; ls -al

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

cd /fakedir && ls -al

Поскольку && оператор будет продолжать работу только в том случае, если предыдущая команда вышла нормально (состояние нуля), нет ls будет выполняться операция.

Существуют и другие операторы, такие как & который будет зависеть от процесса. Хотя он часто помещается в конце команды, он может быть помещен в середину цепочки.


15
2018-03-24 21:00





Вы также можете объединить их, как if..then..else для цепной логики команд.

пример:

ls file.ext && echo "file exists" || echo "file does not exist"

3
2018-03-08 08:32