Какова цель «&&» в команде оболочки?

284

Насколько я знаю, с помощью & после запуска команды в фоновом режиме.

Пример использования &: tar -czf file.tar.gz dirname &

Но как насчет &&? (посмотрите на этот пример: https://serverfault.com/questions/215179/centos-100-disk-full-how-to-remove-log-files-history-etc#answer-215188)

Теги:
command-line
syntax
posix

8 ответов

334

&& позволяет вам сделать что-то, основанное на успешной успешной работе предыдущей команды, - поэтому вы склонны видеть ее цепью как do_something && do_something_else_that_depended_on_something.

319

Кроме того, у вас также есть || что является логическим или, а также ; это просто разделитель, который не заботится о том, что случилось с командой раньше.

$ false || echo "Oops, fail"
Oops, fail

$ true || echo "Will not be printed"
$  

$ true && echo "Things went well"
Things went well

$ false && echo "Will not be printed"
$

$ false ; echo "This will always run"
This will always run

Некоторые подробности об этом можно найти здесь. Списки команд в руководстве по Bash.

  • 3
    Может быть, вы хотели бы добавить false && echo "Will not be printed" .
77

командная строка - какова цель &&?

В раковине, когда вы видите

$ command one && command two

намерение состоит в том, чтобы выполнить команду, которая следует за && только если первая команда успешна. Это идиоматично для оболочек Posix, а не только в Bash.

Он намерен предотвратить запуск второго процесса в случае сбоя первого.

Процессы возвращают 0 для истины, другие положительные числа для ложных

Программы возвращают сигнал при выходе. Они должны возвращать 0, если они успешно завершены, или больше нуля, если они этого не делают. Это позволяет ограниченное количество связи между процессами.

&& упоминается как AND_IF в грамматике оболочки posix, которая является частью списка команд and_or, который также включает в себя || который является OR_IF с похожей семантикой.

Грамматические символы:

%token  AND_IF    OR_IF    DSEMI
/*      '&&'      '||'     ';;'    */

Грамматика:

and_or           :                         pipeline
                 | and_or AND_IF linebreak pipeline
                 | and_or OR_IF  linebreak pipeline

Оба оператора имеют одинаковый приоритет и оцениваются слева направо (они являются ассоциативными слева). Например, следующее:

$ false && echo foo || echo bar
$ true || echo foo && echo bar

оба эхо только bar.

  1. В первом случае false - это команда, которая выходит со статусом 1

    $ false
    $ echo $?
    1
    

    что означает, что echo foo не запускается (т.е. короткое замыкание echo foo). Затем команда echo bar выполняется.

  2. Во втором случае true выходит с кодом 0

    $ true
    $ echo $?
    0
    

    и, следовательно, echo foo не выполняется, тогда echo bar выполняется.

31

Довольно распространенное использование для '& &' компилирует программное обеспечение с помощью autotools. Например:

./configure --prefix=/usr && make && sudo make install

В принципе, если конфигурация завершается успешно, make запускается для компиляции, и если это удается, make выполняется от root для установки программы. Я использую это, когда я в основном уверен, что все будет работать, и это позволяет мне делать другие важные вещи, такие как смотреть на stackoverflow, а не "отслеживать" прогресс.

Иногда я действительно увлекаюсь...

tar xf package.tar.gz && ( cd package; ./configure && make && sudo make install ) && rm package -rf

Я делаю это, когда, например, создаю linux с нуля.

  • 0
    Хорошо в REPL, но для скриптов я бы предпочел set -o errexit для Bash.
17

&& объединяет команды. Последовательные команды выполняются только в том случае, если предыдущие выполняются.

Аналогично, || позволит выполнить последовательную команду, если предыдущее не выполнено.

См. Bash Программирование оболочки.

6

command_1 && command_2: выполнить команду_2 только тогда, когда команда_ успешно выполнена.

command_1 || command_2: выполнить команду_2 только тогда, когда команда_1 не выполнена успешно.

Похоже, как условие "если" выполняется на основном языке программирования, например, в if (condition_1 && condition_2){...} условие_2 будет опущено, если условие_1 равно false, а в if (condition_1 || condition_2){...} условие_2 будет опущено, если условие_1 равно true. Смотрите, это тот же трюк, который вы используете для кодирования:)

  • 0
    Я не знаю, что вы подразумеваете под «с точностью до наоборот», но $ echo '1' || echo '2' печатает только '1'. и $ неправильная_команда || echo '2' печатает сообщение об ошибке и '2' на следующей строке. Не могли бы вы объяснить немного больше о том, что вы думаете об этом неправильно?
  • 0
    О, чувак, я, конечно, слишком устал вчера. извините за это, это был только я: / Мне нужно, чтобы вы отредактировали что-то в своем ответе, если вы хотите, чтобы я высказался (чтобы сделать ваш ответ 0, прямо сейчас stackoverflow просит изменить, поэтому я не могу)
Показать ещё 2 комментария
6

См. пример:

mkdir test && echo "Something" > test/file

Shell попытается создать каталог test, а затем , только если он был успешно, попробуйте создать файл внутри него.

Таким образом, вы можете прервать последовательность шагов, если один из них потерпел неудачу.

4

Он должен выполнить второй оператор, если первый оператор завершится успешно. Как оператор if:

 if (1 == 1 && 2 == 2)
  echo "test;"

Сначала он пытается, если 1 == 1, если это правда, он проверяет, 2 == 2

  • 1
    Может ли кто-нибудь объяснить, почему это было отвергнуто для пользователей, наткнувшихся на вопрос?
  • 0
    @ user3243242 это не так, просто плохой пример, иллюстрирующий использование &&
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню