我经常看到以下语法:
awk 'stuff' <file
sort <file
问题是,我通常这样写:
awk 'stuff' file
sort file
事情进展顺利。因此,如果两种语法大致相同(或者是吗?),那么使用<file
语法有什么好处吗?
编辑
现有的线程涵盖了我的一些询问(使用<
意味着 shell 打开文件第一的和然后将其作为命令的标准输入传递),但我觉得有些仍然存在:
- POSIX 合规性 ?
file
是为了消除关于论证性质的任何歧义吗?- 它特定于某种类型的 shell 吗?
- 它被视为已弃用吗?
- 性能方面,有显着差异吗?
- 欢迎您使用其中一种来对抗另一种的任何示例。
答案1
如果命令支持从标准输入(表单command <file
)或参数列表中的命名文件读取,则两者都可以工作。甚至tcsh
支持command <file
,因此语法相当可移植;给定命令是否可以读取参数列表(或标准输入)中的文件取决于该命令;ed(1)
例如从标准输入读取命令,因此无法从标准输入读取文件。
在 C 级别,从标准输入或命名文件读取的命令将执行类似的操作
#include <err.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
FILE *fhandle;
// option processing here ...
if (argc == 0 || strncmp(*argv, "-", (size_t) 2) == 0) {
fhandle = stdin;
} else {
if ((fhandle = fopen(*argv, "r")) == NULL)
err(1, "could not open '%s'", *argv);
}
// read from fhandle here, which is either from stdin or a file ...
}
有些命令要求command -
表单指示从标准输入读取,其他命令会在参数列表为空时自动执行此操作(如上述代码)。否则,任何一种情况下的代码都将处理fhandle
,并且不关心输入来自哪里(除非错误消息需要包含文件名,但可以将其插入附加变量中)。