Outra possibilidade é usar command
para rebaixar exec
de um especial incorporado para um antigo interno como:
alias shh='command exec >/dev/null 2>&1'
Agora você pode fazer:
(shh; call some process &)
Acabei de notar que command
não funciona em zsh
(como parece na maioria dos outros shells) , mas onde não funciona você pode fazer:
alias shh='eval "exec >/dev/null 2>&1"'
... que deve funcionar em todos os lugares.
Na verdade, você pode até fazer:
alias shh='command exec >"${O:-/dev/null}" 2>&1'
Então você poderia fazer:
O=./logfile; (shh;echo can anyone hear &)
O=; (shh; echo this\? &)
cat ./logfile
OUTPUT
can anyone hear
Continuando com uma discussão de comentários com @ vinc17, vale a pena notar que quase toda a saída do console de um aplicativo GUI é geralmente destinada ao console de X
- seu console. Quando você executa um aplicativo X
a partir de um arquivo X
.desktop
, a saída que gera é roteada para o terminal virtual X
- que é o tty de onde você iniciou X
em primeiro lugar. Eu posso endereçar este número tty com $XDG_VTNR
.
Estranhamente - e talvez porque comecei a usar startx
- não consigo mais escrever apenas em /dev/tty$XDG_VTNR
. Isso pode também (como acho mais provável) ter algo a ver com a mudança muito recente e drástica implementada com Xorg
v1.16 que permite que ele seja executado sob uma sessão de usuário systemd
do que exigir privilégios root .
Ainda assim, posso fazer:
alias gui='command exec >/dev/tty$((1+$XDG_VTNR)) 2>&1'
(gui; some x app &)
Agora, todas as saídas do console de some x app
estão sendo roteadas para /dev/tty$((1+$XDG_VTNR))
, em vez de minha xterm
's pty. Eu posso pegar a última página disso a qualquer momento como:
fmt </dev/vcs$((1+$XDG_VTNR))
Provavelmente, é uma prática recomendada dedicar algum terminal virtual para registrar a saída de qualquer maneira. O /dev/console
geralmente já é reservado para isso, embora você possa preferir não fazer o chown
que provavelmente será necessário para que você possa escrever com atenção. Você pode ter alguma função que permite fazer um printk
- que é basicamente imprimir em /dev/console
- e assim poderia usá-lo dessa forma, suponho.
Outra maneira de fazer isso seria dedicar um pty a esses propósitos. Você poderia, por exemplo, manter uma janela xterm
aberta, salvar a saída de tty
quando executada a partir de lá em uma variável de ambiente e usar esse valor como destino para a saída de gui
. Dessa forma, todos os logs seriam roteados para uma janela de log separada, que você poderia percorrer se quisesse.
Uma vez eu escrevi uma resposta sobre como uma coisa semelhante poderia ser feita com a história bash
, se você está interessado.