【问题标题】:Reopen STDOUT and STDERR after closing them?关闭 STDOUT 和 STDERR 后重新打开它们?
【发布时间】:2015-06-22 04:04:12
【问题描述】:

在 bash 中认为我做了这件蠢事:

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

我确定我还没有输掉比赛(哎呀,实际上我输了The Game),我可以重新连接到标准输出。我的想法是我不知道怎么做。

我尝试的第一件事是创建一个 fifo 并使用另一个 shell 来监视第一个 shell 的标准输出。它没有工作,我不知道为什么:

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

【问题讨论】:

    标签: bash


    【解决方案1】:

    我在 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&gt;&amp;0exec 2&gt;&amp;0 所做的 /dev/pts/10 将它们恢复正常

    【讨论】:

      【解决方案2】:

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

      exec 2>&0 1>&0
      

      你也可以使用/dev/tty:

      exec 2>/dev/tty 1>&2
      

      你必须盲目地这样做,因为stderrbash 回显您输入的内容,没有stderr,它无法回显。

      【讨论】:

      • 好吧,我想我明白了。 &0, &1 和 &2 都是同一个文件指针,我当前的终端对吗?
      猜你喜欢
      • 2011-09-19
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多