另一种可能性是使用command
降级exec
从特殊的内置降级到普通的旧内置,例如:
alias shh='command exec >/dev/null 2>&1'
现在,您可以执行以下操作:
(shh; call some process &)
我刚刚注意到,command
它不能在其中工作zsh
(就像在其他大多数shell中一样),但是在不工作的地方,您可以改为:
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应用程序的控制台输出通常都用于tty- X
其控制台。X
从X
.desktop
文件运行应用程序时,其生成的输出将路由到X
的虚拟终端-首先是从哪个tty启动X
。我可以使用来解决这个tty号码$XDG_VTNR
。
奇怪的是-也许是因为我刚刚开始使用startx
-我似乎再也无法写信给了/dev/tty$XDG_VTNR
。这也可能(我认为更可能)与Xorg
v1.16 实施的最新变化有关,该变化允许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
历史完成类似事情的答案。