我的问题是关于重定向优先级是bash。假设你有一个命令:
cmd1 < cmd2 > cmd3
可以翻译成:
(cmd1 < cmd2) > cmd3
或者
cmd1 < (cmd2 > cmd3)
答案1
这POSIX 标准规定shell 重定向是从左到右;也就是说,顺序很重要:
该构造
2>&1
通常用于将标准错误重定向到与标准输出相同的文件。由于重定向从头到尾发生,因此重定向的顺序很重要。例如:ls > foo 2>&1
将标准输出和标准错误定向到 file
foo
。然而:ls 2>&1 > foo
仅将标准输出定向到 file ,
foo
因为在标准输出定向到 file 之前,标准错误已复制为标准输出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
。
答案2
我想都不是。一对括号表示一个子 shell。但在这种情况下,由于重定向,不会启动任何子 shell。 Bash 只是将 stdin 提供cmd2
给 stdin,并将 stdout 提供给cmd3
.
我在想,你的意思是这样吗cmd1 | cmd2 | cmd3
?因为你的cmd2
和cmd3
通常是普通文件而不是“cmds”。