如何将'stdout'重定向到'stderr'和'stderr'到'stdout'?

IQA*_*eas 1 linux bash terminal io-redirection

我想重定向是应该去的一切stdoutstderr,那就是要一切stderrstdout代替.

以下代码不起作用:

$ bin/stdout-test 1>&2 2>&1
Run Code Online (Sandbox Code Playgroud)

我确信在某个地方有一个实际用途,但目前只是一个心理练习,以帮助学习和理解io重定向.

在Ubuntu中,双方stdoutstderr重定向到控制台,所以你真的不能告诉,如果你取得任何进展,但该命令tcpserver会重定向stdout到连接远程用户,并stderr以启动该终端tcpserver会话,使其成为一个完美测试这种类型的重定向的地方.

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

200*_*ess 5

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

使用exec移动文件描述符.

( exec 3>&1- 1>&2- 2>&3- ; bin/stdout-test )
Run Code Online (Sandbox Code Playgroud)

要不就

bin/stdout-test 3>&1- 1>&2- 2>&3-
Run Code Online (Sandbox Code Playgroud)

说明:

  1. 3>&1- 将标准输出(FD 1)移动到FD 3
  2. 1>&2- 将stderr(FD 2)移动到FD 1
  3. 2>&3- 将FD 3移动到stderr(FD 2)

请参阅移动文件描述符.