【问题标题】:How do I redirect 'stdout' to 'stderr' and 'stderr' to 'stdout'? [duplicate]如何将“stdout”重定向到“stderr”,将“stderr”重定向到“stdout”? [复制]
【发布时间】:2015-09-10 01:02:38
【问题描述】:

我想将所有应该转到stdout 的内容重定向到stderr,并将所有应该转到stderr 的内容重定向到stdout

以下代码不起作用:

$ bin/stdout-test 1>&2 2>&1

我确信这在某处有实际用途,但目前它只是帮助学习和理解 io 重定向的心理练习。

在 Ubuntu 中,stdoutstderr 无论如何都会被重定向到控制台,因此您无法确定自己是否取得了任何进展,但命令 tcpserver 会将 stdout 重定向到正在连接的遥控器用户和stderr 到启动tcpserver 会话的终端,使其成为测试此类重定向的理想场所。

我为此创建了一个测试项目:

【问题讨论】:

    标签: linux bash terminal io-redirection


    【解决方案1】:

    您的尝试不起作用,因为1>&2 将 stdout 合并到 stderr,之后就再也没有希望将它们分开了。您需要第三个临时文件描述符来进行交换,例如交换两个变量的值时。

    使用exec 移动文件描述符。

    ( exec 3>&1- 1>&2- 2>&3- ; bin/stdout-test )
    

    或者只是

    bin/stdout-test 3>&1- 1>&2- 2>&3-
    

    解释:

    1. 3>&1- 将 stdout (FD 1) 移动到 FD 3
    2. 1>&2- 将 stderr (FD 2) 移动到 FD 1
    3. 2>&3- 将 FD 3 移动到 stderr (FD 2)

    Moving File Descriptors

    【讨论】:

      猜你喜欢
      • 2014-07-22
      • 2022-01-18
      • 2012-08-07
      • 2011-07-22
      • 2012-07-14
      • 2010-10-07
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多