考虑以下示例:
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
。