我想知道为什么尽管我的命令中有重定向顺序,但标准错误总是首先输出:
“首先>
然后2>&1
”
lyg@lyg-VirtualBox:~$ > txt
lyg@lyg-VirtualBox:~$ ls txt tt ttt > txt 2>&1
lyg@lyg-VirtualBox:~$ cat txt
ls: cannot access tt: No such file or directory
ls: cannot access ttt: No such file or directory
txt
“首先2>
然后1>&2
”
lyg@lyg-VirtualBox:~$ ls txt tt ttt 2> txt 1>&2
lyg@lyg-VirtualBox:~$ cat txt
ls: cannot access tt: No such file or directory
ls: cannot access ttt: No such file or directory
txt
每个重定向的详细过程是什么?
答案1
因为ls
首先统计所有文件,输出缺失文件的错误消息,然后对现有文件名进行排序并输出它们。
因此重定向对输出顺序没有影响。你可以编写一个简单的命令来测试这一点,该命令向两个 fd 输出一些内容,它们的顺序将相同
$ f() { echo stdout; echo stderr >&2; }
$ f > /tmp/output 2>&1
$ cat /tmp/output
stdout
stderr
$ f 2> /tmp/output >&2
$ cat /tmp/output
stdout
stderr