关闭它们后重新打开STDOUT和STDERR?

时间:2015-06-21 19:58:00

标签: bash

在bash中,我认为我做了这个愚蠢的事情:

$ exec 1>&-
$ exec 2>&-

我确信我还没有输掉游戏(哎呀其实我失去了The Game)我可以重新连接到stdout。这个想法是我不知道怎么做。

我尝试的第一件事是创建一个fifo并使用另一个shell来监视第一个shell的stdout。它不起作用,我不知道为什么:

从tty1

$ mkfifo stdout
$ exec 1>stdout
$ echo "Hello stdout"

TTY2

$ tail -f stdout
$ # nothing here
  

我怎样才能重新连接已关闭的STDOUTSTDERR

我知道解决方法是在播放之前保存STDOUT:

$ exec 3>&1
$ exec 1>&-
$ echo "Nothing will see this"
$ exec 1<&3 # Restoring stdout

2 个答案:

答案 0 :(得分:8)

我在Ubuntu机器上运行它,所以我不确定它是否会为你工作,但这就是我所做的:

$ exec 1>&0
$ exec 2>&0

突然间,我重新连接了STDOUT和STDERR。魔术!

说明:运行以下命令,我们得到以下输出:

$ ls -l /dev/stdout
lrwxrwxrwx 1 root root 15 Jun 11 23:39 /dev/stdout -> /proc/self/fd/1

$ ls -l /proc/self/fd/1
lrwx------ 1 jay jay 64 Jun 22 01:34 /proc/self/fd/1 -> /dev/pts/10

$ ls -l /proc/self/fd/
total 0
lrwx------ 1 jay jay 64 Jun 22 01:35 0 -> /dev/pts/10
lrwx------ 1 jay jay 64 Jun 22 01:35 1 -> /dev/pts/10
lrwx------ 1 jay jay 64 Jun 22 01:35 2 -> /dev/pts/10
lr-x------ 1 jay jay 64 Jun 22 01:35 3 -> /proc/12224/fd

由于所有三个fd指向相同的东西,我们只需指向exec 1>&0exec 2>&0做的/ dev / pts / 10就可以将它们恢复正常。 p>

答案 1 :(得分:6)

最简单的方法,因为您还没有关闭stdin,它也连接到您的终端:

exec 2>&0 1>&0

您也可以使用/dev/tty

exec 2>/dev/tty 1>&2

你必须盲目地做到这一点,因为stderrbash回复你输入的内容,而没有stderr,它就无法回应。