'&&' 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 $?
.