Как скрыть информацию о процессе оболочки при запуске фонового процесса?

19
[USER@SERVER ~] sleep 3 &
[1] 5232
[USER@SERVER ~] 
[1]+  Done                    sleep 3
[USER@SERVER ~] 

Как мне / dev / null эти два сообщения ?:

[1] 5232
[1]+  Done                    sleep 3

PS: так мне нужен вывод процесса, а не упомянутые две строки!

LanceBaynes
источник
Вы получаете только эти строки, когда вы запускаете его в интерактивном режиме Вы этого не сделаете, если вы запустите его из сценария, например.
Дероберт

Ответы:

24

Это не вывод программы, это полезная информация оболочки.

В любом случае, их можно скрыть, используя subshell и перенаправление вывода

( sleep 3 & ) > /dev/null 2>&1
ДМИТРИЙ МАЛИКОВ
источник
2
«2> / dev / null» - это хорошо, мне нужен вывод процесса
LanceBaynes
@LanceBaynes Процесс также может написать что-то на stderr.
Крис Даун
2
К сожалению, это побеждает получение pid с помощью $!
Deleplace
3

В bash или zsh вы можете позвонить, disown %1чтобы сказать оболочке забыть о работе. Тогда оболочка не будет печатать никаких сообщений об этом задании и не будет показывать его при запуске jobsили отправке SIGHUP. В zsh запуск задания &!вместо вместо &эквивалентен disownнемедленному вызову .

Жиль "ТАК - прекрати быть злым"
источник
1

Не могу прокомментировать (пока) @Gilles, но похоже, что это & disownработает и в bash:

sleep 3 & disown
dubberx
источник
Похоже, что это не работает в Bash v.4.1.2
Алексей Магура
1

Пытаться:

user@host:~$ read < <( sleep 10 & echo $! )
user@host:~$ echo $REPLY
28677

И вы скрыли и вывод, и PID . Обратите внимание, что вы все равно можете получить PID из $ REPLY

mark_infinite
источник