Answers:
该POSIX标准规定,壳牌重定向从左至右; 也就是说,顺序很重要:
该结构
2>&1通常用于将标准错误重定向到与标准输出相同的文件。由于重定向从头到尾发生,因此重定向的顺序很重要。例如:ls > foo 2>&1将标准输出和标准错误都定向到文件
foo。然而:ls 2>&1 > foo仅将标准输出定向到文件,
foo因为在将标准输出定向到文件之前将标准错误复制为标准输出foo。
bash 按照标准的这一部分进行操作:
$ ls doesnotexist > foo 2>&1
$ cat foo
ls: cannot access doesnotexist: No such file or directory
$ ls doesnotexist 2>&1 > foo
ls: cannot access doesnotexist: No such file or directory
$ cat foo
$
至于管道:
由于标准输入或标准输出或两者的管线分配是在重定向之前进行的,因此可以通过重定向对其进行修改。例如:
$ command1 2>&1 | command2将的标准输出和标准误差发送
command1到的标准输入command2。
ls > foo 2>&1将stdout重定向到foo,然后将stderr重定向到stdout。因此,这不起作用。同样,第二个命令应该起作用。我在这里想念什么?
ls > foo 2>&1操作如下:首先,将标准输出重定向到foo,然后将标准错误重定向到标准输出(现在是file)foo。第二个示例的ls 2>&1 > foo操作如下:在将标准输出重定向到之前,将标准错误重定向到标准输出foo,因此将标准错误本地回显而不是定向到文件。
ls 2>&1 >foo 也许您可以这样想。来自“ ls”的stderr重定向到stdout。这会发生!无论与stdout有关的任何其他指令,它都将转到当前已分配给stdout的位置。(因为这是它的prime / first指令)。然后出现另一个指令,说stdout将进入“ foo”,而且它......记住:标准错误不会蜕变成真正成为标准输出..它只是到标准输出是在该指令的时间分配。(例如航站楼)