27

Если я запускаю команду в фоновом режиме с & , например:

sleep 2 &

когда команда заканчивается, я получаю "Готово". Как я могу избежать появления сообщения "Готово"?

4 ответа4

30

Выполнить встроенную оболочку:

$ set +m

Это работает путем отключения "режима монитора", чтобы оболочка не сообщала о прекращении фоновых заданий.

Хотя команда запускается в подоболочке вроде:

$ (sleep 2&)

... также отключит сообщение, единственная причина, по которой оно работает, это то, что режим монитора включен по умолчанию только для интерактивных оболочек. То есть подоболочка избегает сообщения, запустив дополнительную оболочку с автоматическим «set +m».

28

Запустите команду в подоболочке:

(sleep 2 &)
7

Я хотел бы уточнить два предыдущих ответа. Если вы никогда не хотите видеть сообщение «Готово» из каких-либо команд в вашей оболочке, используйте set +m . Просто поместите его в свой .profile и / или .bashrc и все готово. Обратите внимание, что если вы наберете это:

set +m
sleep 2 &
set -m

и сон заканчивается после последнего set -m , вы все равно получите сообщение о готовности.

Если вы хотите отключить сообщение для одиночного вызова команды, лучше использовать метод subshell (sleep 2 &) .

Честно говоря, я знал только о set +m , поэтому +1 к Wooble за то, что он меня просветил. Однако стоит отметить, что одно из двух решений, которые вы хотите, зависит от того, что вы пытаетесь сделать.

0

Без подоболочки вы можете сделать следующее:

silent_background() {
    { 2>&3 "$@"& } 3>&2 2>-
    disown &>/dev/null  # Close STD{OUT,ERR} for silence if job has already completed
}

silent_background sleep 5

На основании этого ответа.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .