Другая возможность - использовать 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-приложения обычно предназначены для X
tty - его консоли. Когда вы запускаете X
приложение из X
.desktop
файла, вывод, который он генерирует, направляется на X
виртуальный терминал - то есть тот, с которого он был запущен X
. Я могу обратиться к этому номеру tty с $XDG_VTNR
.
Странно, хотя - и, возможно, потому что я только начал использовать startx
- я больше не могу просто писать в /dev/tty$XDG_VTNR
. Это также может (как мне кажется, более вероятно) иметь какое-то отношение к самым последним и радикальным изменениям, реализованным в Xorg
v1.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))
мой xterm
pty. Я могу получить последнюю страницу этого в любое время, как:
fmt </dev/vcs$((1+$XDG_VTNR))
Вероятно, в любом случае лучше всего выделить какой-нибудь виртуальный терминал для вывода журнала. /dev/console
как правило, уже зарезервировано для этого, хотя вы можете предпочесть не делать то, chown
что, вероятно, требуется для вас, чтобы беспечно написать на это. У вас может быть какая-то функция, которая позволяет вам выполнять printk
- которая в основном печатает, /dev/console
- и поэтому я могу использовать ее таким образом, как я полагаю.
Другой способ сделать это - посвятить pty таким целям. Вы можете, например, оставить xterm
окно открытым, сохранить выходные данные tty
при запуске оттуда в переменной среды и использовать это значение в качестве места назначения для gui
выходных данных. Таким образом, все журналы будут перенаправлены в отдельное окно журнала, которое вы можете затем прокрутить, если хотите.
Однажды я написал ответ о том, как подобное можно сделать с bash
историей, если вам интересно.