На этот вопрос уже есть ответ:
При написании сценария bash, который лучше объединять команды в цепочку, ставится точка с запятой ;
или двойной амперсанд &&
?
Как steeldriver говорит, ни один не лучше, чем другой. Вы используете их в различных целях.
Использовать ;
если Вы хотите выполнить одну команду, то другой. Вторая команда будет работать независимо от действительно ли первая, за которой следуют. Разделение команд с a ;
достигает той же цели как выполнение одной команды и затем выполнение другого. В сценарии они достигают той же цели:
first-command
second-command
first-command; second-command
Напротив, &&
проверяет статус выхода первой команды и только выполняет вторую команду если первая команда, за которой следуют. В сценариях оболочки (и когда Вы используете оболочку в интерактивном режиме, также), код выхода 0 взят для значения "верный" или "успех", в то время как любой другой код выхода взят для значения "лжи" или "отказа". (Тот путь, программы могут возвратить различные коды ошибок для выражения различных видов ошибок.)
Так, здесь, как прежде, first-command
выполнения сначала. Но если это не успешно выполняется, затем second-command
не выполняется вообще:
first-command && second-command
Это подобно, но не точно то же как, с помощью if
:
if first-command; then
second-command
fi
Путем они - различная ложь в том, что происходит когда first-command
сбои. С &&
, статус выхода всей составной команды является любым сбоем (т.е. ненулевой) код выхода first-command
возвращенный. Напротив, с if
, статус выхода всей составной команды является нулем (т.е. успех) когда first-command
сбои.
Как пример ситуации, где Вы могли бы на самом деле обоснованно рассмотреть обоих ;
и &&
, предположите, что Вы хотели работать sudo apt update
, который получает актуальную информацию о том, чем пакеты доступны из каждого из Ваших настроенных источников программного обеспечения и в какой версии, сопровождаемые sudo apt upgrade
, обновить Ваши установленные пакеты до их последних доступных версий. Это широко предлагается и - то, что я обычно выполняю:
sudo apt update && sudo apt upgrade
Поскольку это использует &&
, это работает sudo apt update
, но только выполнения sudo apt upgrade
если sudo apt update
сообщаемый, что это успешно выполнилось. Причина Вы обычно хотели бы это, в случае тех конкретных команд, состоит в том, что Вы обычно хотели бы осмотреть любые ошибки, которые произвела первая команда, чтобы решить, как продолжить двигаться.
Но Вы могли бы ожидать проблему, но все еще хотеть обновить, какие пакеты Вы могли. Или Вы не могли бы ожидать проблему, но просто предпочесть продолжать двигаться вперед так или иначе. В той ситуации Вы могли разделить их с ;
(или просто помещенный их на отдельные строки, в сценарии):
sudo apt update; sudo apt upgrade
Это работает sudo apt update
, затем выполнения sudo apt upgrade
независимо от того, сообщило ли это о следовании.
Это работает примером ситуации, где Вы могли бы на самом деле выбирать между этими двумя, потому что это - случай, где первая команда важна для второй, но где второй мог бы все еще быть полезным, даже если бы первый перестал работать. Однако во многих ситуациях, где Вы хотите выполнить одну команду и затем другого, Вы, любой имеет:
;
или разместите их в отдельные строки сценария.&&
разделить их.Между прочим, существует также a ||
оператор. Это выполняет вторую команду, только если первая команда перестала работать, а не только если она успешно выполнилась (как с &&
):
first-command || second-command
||
не должен быть перепутан с |
, который настраивает канал между командами.