'&&' vs. '&' с командой 'test' в Bash

Рассмотрим:

[email protected]:~$ test -x examples.desktop  && echo $?
[email protected]:~$ test -x examples.desktop  & echo $?
[1] 2992
0

Почему Баш ведет себя так, как есть в этой ситуации?

Команда тестирования просто не завершается, и поэтому команда echo не обрабатывается?

Ответ 1

Значение && и & по сути различны.

  • Что такое && в Bash? В Bash - и во многих других языках программирования - && означает "И". И в контексте выполнения команды, подобном этому, это означает, что элементы слева и справа от && должны выполняться последовательно в этом случае.
  • Что такое & в Bash? И один & означает, что предыдущие команды - непосредственно слева от & - просто должны выполняться в фоновом режиме.

Итак, глядя на ваш пример:

[email protected]:~$ test -x examples.desktop  && echo $?
[email protected]:~$ test -x examples.desktop  & echo $?
[1] 2992
0

Первая команда - как она структурирована - на самом деле ничего не возвращает. Но вторая команда возвращает [1] 2992, в котором 2992 ссылается на идентификатор процесса (PID), который выполняется в фоновом режиме, а 0 является выводом первой команды.

Поскольку вторая команда просто запускает test -x examples.desktop в фоновом режиме, это происходит довольно быстро, поэтому идентификатор процесса порождается и сразу исчезает.

Ответ 2

& выполняет команду в фоновом режиме и возвращает 0 независимо от своего статуса.

Со страницы справочника:

Если команда завершается оператором управления & amp;, оболочка выполняет команду в фоновом режиме в подоболочке. Оболочка не ожидает завершения команды, и возвращается статус 0. Команды, разделенные символом a; выполняются последовательно; оболочка ожидает завершения каждой команды по очереди. Статус возврата - это статус выхода последней выполненной команды.

Ответ 3

Посмотрите, каковы ваши команды:

test -x examples.desktop  && echo $?

Это означает, что нужно проверить, является ли examples.desktop исполняемым, и если это так, выполнить echo $?.

test -x examples.desktop  & echo $?

означает проверку, чтобы увидеть, является ли examples.desktop исполняемым, и запускать его в "фоновом режиме". Затем выполните echo $?.