我总是在命令之后写 stdin 重定向,因为对我来说,先有命令,然后再重定向(如果有的话)更自然:
some-command < input-file > output-file
多年来,我看到人们在命令之前编写 stdin 重定向,以获得一些流程方向:
< input-file some-command > output-file (or without spaces after < and > )
这个顺序是被 POSIX 接受还是被许多 shell 接受(在我的 fedora 21 中它被bash
、dash
、tcsh
和ksh
接受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
。