如何使重定向文件具有自定义顺序

如何使重定向文件具有自定义顺序

这是我的测试.sh文件。

错误和输出.sh

#!/bin/bash

echo myecho
ls dflj

如果我跑./errorandoutput.sh >file 2>&1,那么我们可以得到这样的file

但我希望STDOUT信息在 后面STDERR。所以我将命令更改为

./errorandoutput.sh >file 1>&2

但我得到一个空的file。如何使信息位于重定向STDOUT之后?STDERRfile


我的意思是我希望我能得到一个file喜欢

ls: cannot access 'dflj': No such file or directory
myecho

答案1

这不是重定向顺序的工作方式。

重定向的顺序仅决定 shell 对文件描述执行的操作顺序,而不决定其内容。

在:

./errorandoutput.sh >file 2>&1

首先,shell 将标准输出重定向到file,然后将标准错误重定向到现在指向的标准输出file,因此标准输出和标准错误现在都转到file

在此阶段,shell 已完成重定向。它与文件内容无关file

内容的顺序file由您在脚本内运行的命令的顺序决定。将您的脚本更改为:

#!/bin/bash

ls dflj
echo myecho

你就会得到你想要的。

答案2

这 '>' 的作用类似于“1**>**”

这样应该可以工作

./errorandoutput.sh  2>file  1>&2



$ ( echo yay ; fhgfhgf ) > out 2>&1
$ cat out
yay
bash: fhgfhgf: command not found
$ ( echo yay ; fhgfhgf ) 2> out 1>&2
$ cat out
yay
bash: fhgfhgf: command not found

答案3

如果重要,请将标准输出发送到文件,然后再输出。这当然需要一个脚本:

temp=/tmp/yc$$
yourcommand > ${temp}
cat ${temp} && rm -f ${temp}

相关内容