Une autre possibilité est d'utiliser command
pour rétrograder exec
d'un builtin spécial à un vieux buildin simple comme:
alias shh='command exec >/dev/null 2>&1'
Alors maintenant, vous pouvez faire:
(shh; call some process &)
Je viens de remarquer que command
cela ne fonctionne pas zsh
(comme cela semble le faire dans la plupart des autres shells) , mais où cela ne fonctionne pas, vous pouvez le faire à la place:
alias shh='eval "exec >/dev/null 2>&1"'
... qui devrait fonctionner partout.
En fait, vous pourriez même faire:
alias shh='command exec >"${O:-/dev/null}" 2>&1'
Vous pourriez donc faire:
O=./logfile; (shh;echo can anyone hear &)
O=; (shh; echo this\? &)
cat ./logfile
PRODUCTION
can anyone hear
Suite à une discussion de commentaires avec @ vinc17, il convient de noter que la quasi-totalité de la sortie de la console d'une application GUI est généralement destinée à X
tty - sa console. Lorsque vous exécutez une X
application à partir d'un X
.desktop
fichier, la sortie qu'elle génère est routée vers X
le terminal virtuel de - c'est-à-dire quel que soit le terminal à partir duquel vous avez lancé X
en premier lieu. Je peux adresser ce numéro tty avec $XDG_VTNR
.
Curieusement cependant - et peut-être parce que je viens de commencer à utiliser startx
- je n'arrive plus à écrire/dev/tty$XDG_VTNR
. Cela peut également (comme je pense que c'est plus probable) avoir quelque chose à voir avec le changement très récent et radical implémenté avec la Xorg
v1.16 qui lui permet de s'exécuter sous une systemd
session utilisateur plutôt que de nécessiter des privilèges root .
Pourtant, je peux faire:
alias gui='command exec >/dev/tty$((1+$XDG_VTNR)) 2>&1'
(gui; some x app &)
Maintenant tout some x app
la sortie de la console est routée vers /dev/tty$((1+$XDG_VTNR))
plutôt que la mienne xterm
. Je peux obtenir la dernière page de ceci à tout moment comme:
fmt </dev/vcs$((1+$XDG_VTNR))
Il est probablement préférable de dédier un terminal virtuel à la sortie de journal de toute façon. /dev/console
est généralement déjà réservé pour cela, bien que vous préfériez ne pas faire ce chown
qui est probablement nécessaire pour que vous écriviez allègrement à cela. Vous pouvez avoir une fonction qui vous permet de faire un printk
- qui est essentiellement une impression vers /dev/console
- et pourrait donc l'utiliser de cette façon, je suppose.
Une autre façon de le faire serait de dédier un pty à ces fins. Vous pouvez, par exemple, garder une xterm
fenêtre ouverte, enregistrer la sortie de tty
lorsqu'elle est exécutée à partir de là dans une variable d'environnement et utiliser cette valeur comme destination pour gui
la sortie de. De cette façon, tous les journaux seraient acheminés vers une fenêtre de journal distincte, que vous pourriez ensuite parcourir si vous le souhaitez.
J'ai écrit une fois une réponse sur la façon dont une chose similaire pourrait être faite avec l' bash
histoire, si cela vous intéresse.