bash IO重定向,如何du dup() STDERR?

bash IO重定向,如何du dup() STDERR?

考虑以下示例:

exec 10>&2 # duplicate STDERR to fd 10
{ echo ok; inexistantcommand; } > /tmp/both 2>&1 10>/tmp/err
exec 10>&- # close fd 10

我预计 /tmp/err 会出现错误,但它是空白的:

$ cat /tmp/both
ok
-bash: inixistantcommand: command not found

$ cat /tmp/err
$ 

我做错了什么?

编辑:

尝试过:

{ echo ok; qsdfghjk;  } &> >(tee /tmp/both) 2>/tmp/err

但/tmp/两者都只有STDOUT

答案1

这似乎是关于从流中复制数据而不是复制文件描述符。数据流由 复制tee

{ echo ok; this is an error; } 2> >(tee err.log) | cat >both.log

这会将字符串ok和错误消息写入both.log,并且还将错误消息写入err.log

错误消息由 复制tee,它从来自复合命令的重定向错误流的标准输入流读取错误消息。该tee实用程序将其所有输入写入给定文件和标准输出流。复合命令 和 of 的标准输出通过tee管道传输到cat,后者将它们写入both.txt

相关内容