(
и )
запускают команду в подоболочке. Это означает, что отдельная оболочка порождается и команда запускается. Вероятно, это связано с тем, что они хотели использовать специфическую для оболочки операцию (фоновый режим - другие примеры - перенаправление и т. Д.). Первые &
в фонах команд команда запускается в подоболочке (т. Е. make foo
). Второй амперсанд создает фон для самого подоболочки, поэтому вы сразу же получаете командную строку.
Вы можете увидеть эффекты здесь
Передний план текущей оболочки
(bb-python2.6)noufal@NibrahimT61% ls # shell waits for process to complete
a b c d e
Фон на текущей оболочке
(bb-python2.6)noufal@NibrahimT61% ls& #Shell returns immediately.
[1] 3801
a b c d e
[1] + done /bin/ls -h -p --color=auto -X
Использование подоболочки (передний план)
(bb-python2.6)noufal@NibrahimT61% (ls&) # Current shell waits for subshell to finish.
a b c d e
В этом случае текущая оболочка ожидает завершения подоболочки, даже если задание в самой подоболочке является фоновым.
Использование подоболочки (BAckground)
(bb-python2.6)-130- noufal@NibrahimT61% (ls &)&
[1] 3829
a b c d e
[1] + exit 130 (; /bin/ls -h -p --color=auto -X &; )
Оболочка переднего плана возвращается немедленно (не ожидает подоболочки, которая сама не ждет завершения ls). Обратите внимание на разницу в выполнении команды.
Свидетельство о необходимости запуска некоторых команд в подоболочке. Предположим, что вы хотите запустить «команду оболочки» (т. Е. Ту, которая использует специфичные для оболочки вещи, такие как перенаправления, идентификаторы заданий и т. Д.), Вам придется либо выполнить эту команду в подоболочке (используя (
, )
) или используя опцию -c
для оболочек типа bash. Вы не можете просто напрямую exec
такие вещи, потому что оболочка необходима для обработки идентификатора задания или чего-то еще. Амперсанд, который будет иметь подоболочку, немедленно возвращается. Второй амперсанд в вашем коде выглядит (как предлагает другой ответ) избыточным. Случай "убедитесь, что он задний план".