вопрос по команде linux - PullRequest
       16

вопрос по команде linux

3 голосов
/ 21 января 2010

Что делают два амперсанда в следующей команде:

(make foo&)&

Ответы [ 3 ]

3 голосов
/ 21 января 2010

( и ) запускают команду в подоболочке. Это означает, что отдельная оболочка порождается и команда запускается. Вероятно, это связано с тем, что они хотели использовать специфическую для оболочки операцию (фоновый режим - другие примеры - перенаправление и т. Д.). Первые & в фонах команд команда запускается в подоболочке (т. Е. 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 такие вещи, потому что оболочка необходима для обработки идентификатора задания или чего-то еще. Амперсанд, который будет иметь подоболочку, немедленно возвращается. Второй амперсанд в вашем коде выглядит (как предлагает другой ответ) избыточным. Случай "убедитесь, что он задний план".

1 голос
/ 21 января 2010

Трудно сказать без контекста, но команды & in shell запускают команду в фоновом режиме и сразу продолжают, не дожидаясь завершения команды. Возможно, автор Makefile хотел запустить несколько команд параллельно. Второй амперсанд будет излишним, как и скобки.

0 голосов
/ 21 января 2010

Амперсанд используется в качестве символа продолжения строки в make-файлах.

Трудно сказать наверняка, поскольку в вашем вопросе недостаточно контекста.

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