Bash 中 stdin 和 stdout 重定向的优先级

Bash 中 stdin 和 stdout 重定向的优先级

我的问题是关于重定向优先级是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?因为你的cmd2cmd3通常是普通文件而不是“cmds”。

相关内容