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

now*_*wox 8 bash

在bash中考虑我做了这个愚蠢的事情:

$ exec 1>&-
$ exec 2>&-
Run Code Online (Sandbox Code Playgroud)

我相信我还没有输掉比赛(哎呀其实我输掉了比赛)我可以重新连接到标准杆.这个想法是我不知道怎么做.

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

在tty1

$ mkfifo stdout
$ exec 1>stdout
$ echo "Hello stdout"
Run Code Online (Sandbox Code Playgroud)

TTY2

$ tail -f stdout
$ # nothing here
Run Code Online (Sandbox Code Playgroud)

我怎样才能重新连接我的合STDOUTSTDERR后呢?

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

$ exec 3>&1
$ exec 1>&-
$ echo "Nothing will see this"
$ exec 1<&3 # Restoring stdout
Run Code Online (Sandbox Code Playgroud)

Jay*_*iya 8

我在Ubuntu机器上运行它,所以我不确定它是否适用于你,但这就是我所做的:

$ exec 1>&0
$ exec 2>&0
Run Code Online (Sandbox Code Playgroud)

突然,我重新连接了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
Run Code Online (Sandbox Code Playgroud)

由于三个FD的指向同样的事情,我们可以只需指向到/ dev回报他们回到正常/ PTS/10将exec 1>&0exec 2>&0


ric*_*ici 6

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

exec 2>&0 1>&0
Run Code Online (Sandbox Code Playgroud)

你也可以使用/dev/tty:

exec 2>/dev/tty 1>&2
Run Code Online (Sandbox Code Playgroud)

你要做的是盲目的,因为stderr在这里bash回声您键入的内容,如果没有stderr,就不能呼应.