谁能告诉我区别?例如:
如果我有一个文件a.txt
,其中包含以下内容:
一个
b
ç
cat a.txt | cat
和cat < a.txt
之间的区别是什么?
在我看来,他们都模拟STDIN,是正确的,还是有差异?非常感谢。
答案 0 :(得分:11)
管道从一个进程到另一个进程(第一个示例中为cat
),因此需要两个进程协作。重定向由shell本身处理。在shell中执行此操作时很重要,例如working with variables。
答案 1 :(得分:3)
重定向不会“模拟STDIN”。重定向时,文件 进程的标准输入。特别是,如果输入是常规文件而不是管道或tty,则许多程序具有不同的行为,因此您可能会得到不同的行为。例如:
$ < file perl -E 'say "is a regular file" if -f STDIN' is a regular file $ cat file | perl -E 'say "is a regular file" if -f STDIN'
答案 2 :(得分:1)
首先,两个结果是相同的。无话可说。
对于cat a.txt | cat
的工作原理,第一只猫接受参数a.txt
,然后打印其内容。您将第一个stdout
管道传输到第二个stdin
。第二个cat
找不到任何参数,因此它从stdin
读取内容并打印出来。
由于您在第二个命令中使用<
,系统会将stdin
的{{1}}替换为cat
的文件流。在第一种情况下,其他任何东西都与第二只猫相同。