Точка с запятой или двойной амперсанд для объединения команд? [дубликат]

При написании сценария bash, который лучше объединять команды в цепочку, ставится точка с запятой ; или двойной амперсанд && ?

1
задан 21 April 2018 в 13:56

1 ответ

Как 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

|| не должен быть перепутан с |, который настраивает канал между командами.

7
ответ дан 3 December 2019 в 06:24

Другие вопросы по тегам:

Похожие вопросы: