Другая возможность - использовать commandдля перехода execот специальной встроенной функции к простой старой встроенной, например:
alias shh='command exec >/dev/null 2>&1'
Итак, теперь вы можете сделать:
(shh; call some process &)
Я только что заметил, что commandэто не работает zsh (как, кажется, работает в большинстве других оболочек) , но где это не работает, вы можете сделать вместо этого:
alias shh='eval "exec >/dev/null 2>&1"'
... который должен работать везде.
На самом деле, вы могли бы даже сделать:
alias shh='command exec >"${O:-/dev/null}" 2>&1'
Так что вы могли бы сделать:
O=./logfile; (shh;echo can anyone hear &)
O=; (shh; echo this\? &)
cat ./logfile
ВЫХОД
can anyone hear
После обсуждения комментариев с @ vinc17 стоит отметить, что почти все выходные данные консоли GUI-приложения обычно предназначены для Xtty - его консоли. Когда вы запускаете Xприложение из X .desktopфайла, вывод, который он генерирует, направляется на Xвиртуальный терминал - то есть тот, с которого он был запущен X. Я могу обратиться к этому номеру tty с $XDG_VTNR.
Странно, хотя - и, возможно, потому что я только начал использовать startx- я больше не могу просто писать в /dev/tty$XDG_VTNR. Это также может (как мне кажется, более вероятно) иметь какое-то отношение к самым последним и радикальным изменениям, реализованным в Xorgv1.16, которые позволяют запускать его в рамках systemdпользовательского сеанса, а не требовать привилегий root .
Тем не менее, я могу сделать:
alias gui='command exec >/dev/tty$((1+$XDG_VTNR)) 2>&1'
(gui; some x app &)
Теперь весь some x appконсольный вывод перенаправляется на /dev/tty$((1+$XDG_VTNR))мой xtermpty. Я могу получить последнюю страницу этого в любое время, как:
fmt </dev/vcs$((1+$XDG_VTNR))
Вероятно, в любом случае лучше всего выделить какой-нибудь виртуальный терминал для вывода журнала. /dev/consoleкак правило, уже зарезервировано для этого, хотя вы можете предпочесть не делать то, chownчто, вероятно, требуется для вас, чтобы беспечно написать на это. У вас может быть какая-то функция, которая позволяет вам выполнять printk- которая в основном печатает, /dev/console- и поэтому я могу использовать ее таким образом, как я полагаю.
Другой способ сделать это - посвятить pty таким целям. Вы можете, например, оставить xtermокно открытым, сохранить выходные данные ttyпри запуске оттуда в переменной среды и использовать это значение в качестве места назначения для guiвыходных данных. Таким образом, все журналы будут перенаправлены в отдельное окно журнала, которое вы можете затем прокрутить, если хотите.
Однажды я написал ответ о том, как подобное можно сделать с bashисторией, если вам интересно.