关闭标准输出 (>&-)

关闭标准输出 (>&-)

我试图阻止从终端启动的 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 失败,因此程序陷入无限循环。

相关内容