发出“exec &>filename”后将输出恢复到终端

发出“exec &>filename”后将输出恢复到终端

我正在尝试执行以下操作:

exec &>filename

之后我就看不到任何东西了,包括我输入的内容,好吧。

我疯狂地尝试,exec 1>&1但是exec 2>&2什么也没发生。

现在,在不杀死 shell 的情况下,如何分别取回重定向到 stdout 的输出和重定向到 stderr 的错误?文件描述符是引用标准 [in|out]put 和 stderr 的唯一方法吗?

答案1

运行后exec &>filename,shell 的标准输出和标准错误将转到filename。根据定义,标准输入是文件描述符 0,标准输出是 fd 1,标准错误是 fd 2。

文件描述符既不是重定向的,也不是非重定向的:它总是去某个地方(假设进程打开了这个描述符)。重定向文件描述符意味着改变它的去向。当您运行 时exec &>filename,stdout 和 stderr 以前连接到终端,现在连接到filename

总有一种方法可以引用当前终端:/dev/tty。当一个进程打开这个文件时,它总是意味着该进程的控制终端,无论是哪个。因此,如果您想取回该 shell 的原始 stdout 和 stderr,您可以这样做,因为它们连接到的文件仍然存在。

exec &>/dev/tty

答案2

你要

exec &>$(tty)

您在问题中所做的就是在 stdout 和 stderr 中复制已重定向到文件的原始 stdout 和 stderr 。

正如吉尔斯的回答所解释的,tty将返回当前终端的终端设备。这是登录 shell 中默认来自/去往的三个标准文件描述符的位置。因此,上面的语句利用tty将 stdout 和 stderr 重定向回终端设备,就像以前一样。

如果您担心可移植性(根据您对吉尔斯答案的评论),两种方法(终端实用程序/dev/tty文件) 属于 POSIX 标准。

逐字复制吉尔斯的评论:

There's an advantage to /dev/tty: it works even after exec <somefile, 
whereas $(tty) would complain “not a tty”

相关内容