在bash中,我认为我做了这个愚蠢的事情:
$ exec 1>&-
$ exec 2>&-
我确信我还没有输掉游戏(哎呀其实我失去了The Game)我可以重新连接到stdout。这个想法是我不知道怎么做。
我尝试的第一件事是创建一个fifo并使用另一个shell来监视第一个shell的stdout。它不起作用,我不知道为什么:
$ mkfifo stdout
$ exec 1>stdout
$ echo "Hello stdout"
$ tail -f stdout
$ # nothing here
我怎样才能重新连接已关闭的
STDOUT
和STDERR
?
我知道解决方法是在播放之前保存STDOUT:
$ exec 3>&1
$ exec 1>&-
$ echo "Nothing will see this"
$ exec 1<&3 # Restoring stdout
答案 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>&0
和exec 2>&0
做的/ dev / pts / 10就可以将它们恢复正常。 p>
答案 1 :(得分:6)
最简单的方法,因为您还没有关闭stdin
,它也连接到您的终端:
exec 2>&0 1>&0
您也可以使用/dev/tty
:
exec 2>/dev/tty 1>&2
你必须盲目地做到这一点,因为stderr
是bash
回复你输入的内容,而没有stderr
,它就无法回应。