Подтвердить что ты не робот

Есть ли способ сделать управление заданиями bash тихим?

Bash довольно многословно при выполнении заданий в фоновом режиме:

$ echo toto&
toto
[1] 15922
[1]+  Done                    echo toto

Поскольку я пытаюсь запустить задания параллельно и использовать вывод, я бы хотел найти способ заставить замолчать bash. Есть ли способ удалить этот избыточный выход?

4b9b3361

Ответ 1

Вы можете использовать круглые скобки для запуска фоновой команды в подоболочке, и это отключит сообщения управления заданиями. Например:

(sleep 10 & )

Ответ 2

Примечание. Следующее относится к интерактивным сеансам Bash. В сценариях сообщения управления работой никогда не печатаются.

Есть 2 основных сценария для молчания Bash сообщений управления заданиями:


запуска и забыть:

Ответ на полезный ответ CodeGnome предлагает включение фоновой команды в простой подоболочке - например, (sleep 10 &) - который эффективно отключает управление заданиями сообщений - как при создании задания, так и при завершении работы.

Это имеет важный побочный эффект:

  • Используя оператор управления & внутри подоболочки, вы теряете контроль фонового задания - jobs не будет перечислять его, и ни %% (спецификация (ID) от последней запущенной работы), а не $! (PID последнего запуска процесса (как часть) самого последнего задания) будет отражать его. [1]

Для сценариев запуска и забывания это не проблема:

  • Вы просто запускаете фоновое задание,
  • и вы позволите ему закончить самостоятельно (и вы уверены, что он работает правильно).

[1] Возможно, вы можете искать процесс самостоятельно, путем поиска запущенных процессов для тех, которые соответствуют его командной строке, но это громоздко и непросто сделать надежным.


Launch-и-управления, позже:

Если вы хотите, чтобы сохранял контроль над заданием, чтобы вы могли позже:

  • убить его, если потребуется.
  • синхронно ждать (в какой-то более поздней точке) для его завершения,

необходим другой подход:

  • Отключение сообщений управления заданиями создания выполняется ниже, но для того, чтобы отключить сообщения о контроле за завершением задания категорически, вы должны включить опцию оболочки задания OFF

    • set +m (set -m снова включится)
    • Caveat. Это глобальная настройка , которая имеет ряд важных побочных эффектов, в частности:
      • Stdin для фоновых команд - это /dev/null, а не текущая оболочка.
      • Отключены клавиши быстрого доступа для приостановки (Ctrl-Z) и команды приостановки (Ctrl-Y) переднего плана.
      • Для получения полной информации см. 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 для него:

Предостережение: Есть два крайних случая, когда этот метод все еще производит вывод:

  • Если фоновая команда пытается сразу прочитать stdin.
  • Если фоновая команда заканчивается сразу.

Чтобы запустить работу тихо (как указано выше, но без 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, который затем позволяет отключить.

Но, как указано, если задание выполняется само по себе, будет отображаться сообщение управления заданиями.

Ответ 3

Оберните его в манекен script:

quiet.sh:

#!/bin/bash
[email protected] &

затем вызовите его, передав ему команду в качестве аргумента:

./quiet.sh echo toto

Вам может потребоваться сыграть с кавычками в зависимости от вашего ввода.

Ответ 4

Интерактивно, нет. Он всегда будет отображать статус задания. Вы можете влиять, когда статус отображается с помощью set -b.

Ничего не мешает вам использовать вывод ваших команд (через каналы, или хранить его переменные и т.д.). Статус задания отправляется на управляющий терминал оболочкой и не смешивается с другим вводом-выводом. Если вы делаете что-то сложное с заданиями, решение состоит в том, чтобы написать отдельный script.

Сообщения о работе - это действительно проблема, если у вас есть, скажем, функции в вашем bashrc, которые используют управление заданиями, которым вы хотите иметь прямой доступ к вашей интерактивной среде. К сожалению, вы ничего не можете с этим поделать.

Ответ 5

Одним из решений (в bash в любом случае) является маршрутизация всего вывода на /dev/null

    echo 'hello world' > /dev/null &

Вышеизложенное не даст вам никакого вывода, кроме идентификатора для процесса bg.