別の可能性は使用することです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でした。このtty番号はで対処できます$XDG_VTNR
。
不思議なことに、そしてたぶん私が使い始めたからかもしれませんstartx
-私はもはや書くだけではないようです/dev/tty$XDG_VTNR
。これもあり(私は可能性が高いと思いとして)で実装は非常に最近の急激な変化に何か持っているXorg
、それがもとで実行することができますv1.16 systemd
というよりも、必要なユーザーセッションルート権限を。
それでも、私は行うことができます:
alias gui='command exec >/dev/tty$((1+$XDG_VTNR)) 2>&1'
(gui; some x app &)
これで、すべてsome x app
のコンソール出力が/dev/tty$((1+$XDG_VTNR))
my xterm
のpty ではなくにルーティングされます。この最後のページはいつでも取得できます:
fmt </dev/vcs$((1+$XDG_VTNR))
とにかく出力をログに記録するためにいくつかの仮想端末を専用にすることはおそらくベストプラクティスです。/dev/console
一般的には既にこのために予約されていますが、あなたはchown
それを気楽に書くために必要な可能性が高いことをしないことを好むかもしれません。あなたはあなたができることを可能にするいくつかの機能を持っているかもしれませんprintk
-それは基本的に印刷しています/dev/console
-それで私が思うようにそれを使うことができます。
これを行う別の方法は、そのような目的にptyを捧げることです。たとえば、xterm
ウィンドウを開いたままにして、tty
そこから実行されるときの出力を環境変数に保存し、その値をgui
出力の宛先として使用できます。このようにして、すべてのログが個別のログウィンドウにルーティングされ、必要に応じてスクロールできます。
あなたが興味を持っているなら、私はかつてbash
歴史で同様のことができるかについての答えを書きました。