Какова цель "&&" в команде оболочки? - PullRequest
313 голосов
/ 22 декабря 2010

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

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

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

Ответы [ 8 ]

358 голосов
/ 22 декабря 2010

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

339 голосов
/ 22 декабря 2010

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

$ 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.

90 голосов
/ 28 мая 2015

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

В оболочке, когда вы видите

$ command one && command two

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

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

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

Программы возвращают сигнал при выходе. Они должны возвращать 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 выполняется.

30 голосов
/ 19 июня 2012

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

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

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

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

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

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

17 голосов
/ 22 декабря 2010

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

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

См. Программирование в Bash Shell .

8 голосов
/ 22 декабря 2010

См. Пример:

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

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

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

6 голосов
/ 30 июня 2017

command_1 && command_2: выполнять команду_2 только при успешном выполнении команды_1.

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

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

5 голосов
/ 22 декабря 2010

Это выполнение второго оператора, если первый оператор заканчивается успешно.Как оператор if:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...