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


15

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

exec &>filename

之后,我看不到任何内容,包括我键入的内容。

我疯狂地尝试了exec 1>&1exec 2>&2,但没有任何反应。

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


1
嗯...为什么要重定向交互式shell的stderr / stdout?此exec构造通常用于在子Shell中运行的脚本中,以将其输出重定向到例如文件。我没有在互动会话中看到它的用处。
Martin von Wittich 2013年

3
@MartinvonWittich我同意关于exec的声明。我同意。我只是一个在玩耍的孩子:)
user917279 2013年

Answers:


23

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

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

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

exec &>/dev/tty

1
如@Joseph R.回答$(tty)向我展示了/ dev / pty0,但是您的命令也可以使用,哪一种命令在Unix风格上更可移植?感谢您提供更明确的答案。
user917279 2013年

2
@ user917279就处理不同的unix风格而言,它们同样具有可移植性。/dev/tty在以下情况下可用$(tty)/dev/tty在过程具有控制终端的情况下起作用(这是您所希望的最好,因为必须将过程与终端连接起来),而$(tty)要求仍然打开终端在标准输入上。
吉尔(Gilles)“所以,别再邪恶了”

为什么exec &>/dev/ttyexec >/dev/tty呢?
Anthony Rutledge

11

你要

exec &>$(tty)

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

正如Gilles的答案所解释的,tty将返回当前终端的终端设备。默认情况下,这是登录外壳程序中来自/进入三个标准文件描述符的地方。因此,上面的语句tty像以前一样将stdout和stderr重定向回终端设备。

如果您担心可移植性(根据您对Gilles的回答的评论),则这两种方法(tty实用程序/dev/ttyfile)都在POSIX标准中。

从Gilles的评论中复制了逐字记录:

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

有用!谢谢。echo $(tty)给出/ dev / pty0(在cygwin中),它与stdin,stdout有什么关系,上述语句会发生什么?请让我知道是否需要单独回答这个问题。
user917279 2013年

@ user917279答案已更新。
约瑟夫·R.

谢谢约瑟夫。我先看了Giles的答案,然后发布了这个问题。非常感谢你。请允许我将Giles的回答标记为已接受,因为它甚至使像我这样的愚蠢头脑也能正确理解。
user917279 2013年

2
这样做有一个好处/dev/tty:它甚至可以在之后运行exec <somefile,而$(tty)会抱怨“不是tty”。
吉尔(Gilles)“所以,别再邪恶了”

@Gilles感谢您的启发性评论:)
Joseph R.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.