我有以下两个bash脚本:
one.bash:
#!/bin/bash
echo "I don't control this line of output to stdout"
echo "I don't control this line of output to stderr" >&2
echo "I do control this line of output to fd 5" >&5
callone.bash:
#!/bin/bash
# here I try to merge stdout and stderr into stderr.
# then direct fd5 into stdout.
bash ./one.bash 1>&2 5>&1
当我像这样运行时:
bash callone.bash 2>stderr.txt >stdout.txt
stderr.txt文件如下所示:
I don't control this line of output to stdout
I don't control this line of output to stderr
I do control this line of output to fd 5
和stdout是空的。
我希望“do control”行只输出到stdout.txt。
进行更改的限制是:
[编辑]这个用例是:我有一个脚本可以执行其他脚本的各种运行,这些脚本可以输出到stderr和stdout。但我需要确保用户只能看到控制良好的消息。所以我将控制良好的消息发送到fd5,其他所有内容(stdout& stderr)都发送到日志。
答案 0 :(得分:7)
重定向按顺序发生。
运行1>&2
后,您已用fd 2替换了fd 1。
所以,当你运行5>&1
时,你将fd 5重定向到fd 1点现在(不是它开始时的位置)。
您需要反转两个重定向:
bash ./one.bash 5>&1 1>&2