我试图阻止从终端启动的 GUI 程序写入控制台。为此,我运行guiprogram >&-
.这会导致程序冻结某些操作。
运营商具体是做什么的>&-
?其目的是什么?你能举出一些例子吗?通过使用它来阻止写入控制台是否合法?为什么关闭标准输出时程序会冻结?
答案1
如果您想防止程序的输出出现在任何地方,请重定向到/dev/null
:
guiprogram >/dev/null 2>&1
stdout
仅当程序知道如何处理已关闭的文件时,关闭才有效。
实际使用>&-
很少,如果您随后分配另一个输出目的地stdout
并希望确保原始输出通道正确关闭,则可以使用它。
答案2
您必须查看源代码才能知道程序冻结的原因。它也可能中止或崩溃或忽略该问题:
bash -c 'exec >&-; echo foo; echo bar >&2'
bash: line 0: echo: write error: Bad file descriptor
bar
这个 shell 代码忽略了这个问题。
bash -c 'set -e; exec >&-; echo foo; echo bar >&2'
bash: line 0: echo: write error: Bad file descriptor
该 shell 代码由于错误而中止。
如果某种日志记录功能带有循环“重复直到成功记录”,则可能会发生冻结。这种情况永远不会发生,因为写入文件描述符 1 失败,因此程序陷入无限循环。