it-roy-ru.com

Какова цель "&&" в команде Shell?

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

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

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

312
Captain

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

356
girasquid

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

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

335
plundra

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

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

$ command one && command two

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

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

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

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

&& упоминается как AND_IF в грамматика оболочки Posix , которая является частью and_or list команд, которые также включают ||, который является 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 выполняется.

90
Aaron Hall

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

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

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

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

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

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

30
Nigel Atkinson

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

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

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

17
Dean Burge

Смотрите пример:

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

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

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

8
alno

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

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

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

6
Xiaonin Li

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

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

Его первая попытка, если 1 == 1, если это правда, он проверяет, если 2 == 2

5
Nick