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

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был успешным.

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

если 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"
Mtl Dev
источник