в чем разница между «команда && команда» и «команда; команда»

49

Я вижу эти два использования в Ubuntu "команда && команда" и "команда; команда",
напримерapt-get update && apt-get upgrade

Что будет отличаться, если я буду использовать apt-get update; apt-get upgrade?
Я не спрашиваю об этом конкретном использовании, но в целом, в чем разница между этими двумя видами использования?

evilsoup
источник
2
Win командной строки и пакетного имеют ту же функцию: & (simple sequencing), && (conditional AND) and || (conditional OR).
Каран
5
Смотрите также: Справочное руководство Bash - Список команд . В общем, в документации нет ничего, что вы могли бы найти; это действительно стоит посмотреть, если у вас есть вопрос о конкретных элементах синтаксиса.
slhck
1
@Karan И для полноты, bash (linux / Ubuntu) также имеет ||.
Изката

Ответы:

88

&&логический оператор ;это простая последовательность.

В cmd1 && cmd2, cmd2 будет запущен, только если cmd1 завершается с успешным кодом возврата.

Принимая во внимание cmd1; cmd2, что cmd2 будет работать независимо от состояния выхода cmd1 (при условии, что вы не настроили свою оболочку на выход при всех сбоях в вашем скрипте или чем-то еще).

С другой стороны, при cmd1 || cmd2использовании ||логического оператора «ИЛИ» cmd2 будет запускаться только в случае сбоя cmd1 (возвращает ненулевой код завершения).

Эти логические операторы иногда используются в сценариях вместо базового оператора if. Например,

if [[ -f "$foo" ]]; then mv "$foo" "${foo%.txt}.mkd"; fi

... может быть более кратко достигнуто с помощью:

[[ -f "$foo" ]] && mv "$foo" "${foo%.txt}.mkd"
Этан Рейснер
источник
Я нахожу это немного ошибочным, потому что, насколько я понимаю, успешный код возврата означает 0, что при приведении в bool дает логическое ложное значение. Таким образом, следуя философии оценки Маккарти, используемой в большинстве языков, он должен немедленно возвращать false, а не оценивать (выполнять) следующее утверждение.
Делла
33

Синтаксис

command1 && command2

Команда2 выполняется тогда и только тогда, когдаcommand1возвращается нулевое состояние выхода ( true ). Другими словами, запуститеcommand1и, если это успешно, то запуститеcommand2.

command1 ; command2

Обе команды command1 и command2 будут выполняться независимо. Точка с запятой позволяет вводить много команд в одной строке.

Связанные :

command1 || command2

Команда2 выполняется тогда и только тогда, когда команда1 возвращает ненулевой статус выхода. Другими словами, запуститьcommand1успешно или запуститьcommand2.


пример

&& оператор:

$ rm /tmp/filename && echo "File deleted"

; оператор:

$ echo "foo" ; echo "bar"

|| оператор:

$ cat /tmp/filename 2>/dev/null || echo "Failed to open file"

Внешняя ссылка

  1. Linuxtopia.org
  2. Tldp.org
STDERR
источник