标准输入重定向的 posix 放置(

标准输入重定向的 posix 放置(

我总是在命令之后写 stdin 重定向,因为对我来说,先有命令,然后再重定向(如果有的话)更自然:

some-command < input-file > output-file

多年来,我看到人们在命令之前编写 stdin 重定向,以获得一些流程方向:

< input-file some-command > output-file (or without spaces after < and > )

这个顺序是被 POSIX 接受还是被许多 shell 接受(在我的 fedora 21 中它被bashdashtcshksh接受zsh)?

答案1

该行为是由 POSIX 定义的这里:

如果一个命令指定了多个重定向运算符,则计算顺序为从开始到结束。

这里:

“简单命令”是一系列可选的变量分配和重定向,可以任意顺序,可选地后跟单词和重定向,并由控制运算符终止。

这已经是这种情况了伯恩外壳,POSIX 以此为基础。

在执行命令之前,可以使用 shell 解释的特殊符号来重定向其输入和输出。以下内容可能出现在简单命令中的任何位置,也可能位于命令之前或之后,但不会传递给调用的命令。 (……)

与原始的 Bourne shell 不同,POSIX 不允许在复杂命令(如while … done( … )等)之前进行重定向。


请注意,重定向的顺序很重要,因为它控制您的命令行为并防止您在失败时出现一些奇怪的结果。例子:

command <input >output

如果command无法读取input(由于权限,不存在......),那么output如果交换重定向位置,它将被终止而不创建空文件:

command >output <input

答案2

嗯,看起来bash前缀符号仍然失败,因此

$ < /etc/passwd while read line; do echo $line; done
bash: syntax error near unexpected token `do'

whilezsh确实允许在循环之前进行此重定向while

相关内容