Ответ 1
Вы можете использовать круглые скобки для запуска фоновой команды в подоболочке, и это отключит сообщения управления заданиями. Например:
(sleep 10 & )
Bash довольно многословно при выполнении заданий в фоновом режиме:
$ echo toto&
toto
[1] 15922
[1]+ Done echo toto
Поскольку я пытаюсь запустить задания параллельно и использовать вывод, я бы хотел найти способ заставить замолчать bash. Есть ли способ удалить этот избыточный выход?
Вы можете использовать круглые скобки для запуска фоновой команды в подоболочке, и это отключит сообщения управления заданиями. Например:
(sleep 10 & )
Примечание. Следующее относится к интерактивным сеансам Bash. В сценариях сообщения управления работой никогда не печатаются.
Есть 2 основных сценария для молчания Bash сообщений управления заданиями:
Ответ на полезный ответ CodeGnome предлагает включение фоновой команды в простой подоболочке - например, (sleep 10 &)
- который эффективно отключает управление заданиями сообщений - как при создании задания, так и при завершении работы.
Это имеет важный побочный эффект:
&
внутри подоболочки, вы теряете контроль фонового задания - jobs
не будет перечислять его, и ни %%
(спецификация (ID) от последней запущенной работы), а не $!
(PID последнего запуска процесса (как часть) самого последнего задания) будет отражать его. [1]Для сценариев запуска и забывания это не проблема:
[1] Возможно, вы можете искать процесс самостоятельно, путем поиска запущенных процессов для тех, которые соответствуют его командной строке, но это громоздко и непросто сделать надежным.
Если вы хотите, чтобы сохранял контроль над заданием, чтобы вы могли позже:
необходим другой подход:
Отключение сообщений управления заданиями создания выполняется ниже, но для того, чтобы отключить сообщения о контроле за завершением задания категорически, вы должны включить опцию оболочки задания OFF
set +m
(set -m
снова включится)/dev/null
, а не текущая оболочка.man bash
и (без учета регистра) поиск вхождения "управления заданиями".Чтобы отключить сообщения управления заданиями создания, добавьте команду фона в команду group и перенаправьте последний вывод stderr на /dev/null
{ sleep 5 & } 2>/dev/null
В следующем примере показано, как спокойно запускать фоновое задание, сохраняя при этом контроль над работой в принципе.
$ set +m; { sleep 5 & } 2>/dev/null # turn job-control option off and launch quietly
$ jobs # shows the job just launched; it will complete quietly due to set +m
Если вы не хотите отключать опцию управления заданиями (set +m
), единственный способ заставить замолчать сообщение о завершении задания завершения - либо kill
задание, либо wait
для него:
Предостережение: Есть два крайних случая, когда этот метод все еще производит вывод:
Чтобы запустить работу тихо (как указано выше, но без set +m
):
$ { sleep 5 & } 2>/dev/null
В wait
для этого тихо:
$ wait %% 2>/dev/null # use of %% is optional here
В kill
это тихо:
{ kill %% && wait; } 2>/dev/null
Дополнительный wait
необходим, чтобы сделать сообщение о завершении задания завершения, которое обычно отображается асинхронно на Bash (во время фактического завершения процесса, вскоре после убийства), синхронный вывод из wait
, который затем позволяет отключить.
Но, как указано, если задание выполняется само по себе, будет отображаться сообщение управления заданиями.
Оберните его в манекен script:
quiet.sh:
#!/bin/bash
[email protected] &
затем вызовите его, передав ему команду в качестве аргумента:
./quiet.sh echo toto
Вам может потребоваться сыграть с кавычками в зависимости от вашего ввода.
Интерактивно, нет. Он всегда будет отображать статус задания. Вы можете влиять, когда статус отображается с помощью set -b
.
Ничего не мешает вам использовать вывод ваших команд (через каналы, или хранить его переменные и т.д.). Статус задания отправляется на управляющий терминал оболочкой и не смешивается с другим вводом-выводом. Если вы делаете что-то сложное с заданиями, решение состоит в том, чтобы написать отдельный script.
Сообщения о работе - это действительно проблема, если у вас есть, скажем, функции в вашем bashrc, которые используют управление заданиями, которым вы хотите иметь прямой доступ к вашей интерактивной среде. К сожалению, вы ничего не можете с этим поделать.
Одним из решений (в bash в любом случае) является маршрутизация всего вывода на /dev/null
echo 'hello world' > /dev/null &
Вышеизложенное не даст вам никакого вывода, кроме идентификатора для процесса bg.