谁能告诉我有什么不同?例如:
如果我有一个包含以下内容的文件a.txt
:
b
c
cat a.txt | cat
和cat < a.txt
的区别是什么
在我看来,他们都模拟STDIN,是正确的,还是有差异?非常感谢。
管道从一个进程工作到另一个进程(第一个示例中的cat
s),因此需要两个进程合作。重定向由shell本身处理。在shell中做一些事情(比如处理变量)时,这一点很重要。
重定向不"模拟STDIN"。当您重定向时,文件是进程的stdin。特别是,如果输入是常规文件,那么许多程序的行为与输入是管道或tty文件时的行为不同,因此您可能会得到不同的行为。例如:
<>之前$ & lt;文件perl -E '说'是一个常规文件'是一个常规文件$ cat file | perl -E 'say "is a regular file" if -f STDIN'首先,两个结果是相同的。没什么可说的。
对于cat a.txt | cat
的工作原理,第一个cat接受参数a.txt
,然后打印其内容。将第一个的stdout
管道到第二个的stdin
。第二个cat
没有找到参数,所以它从stdin
读取内容,并打印出来。
由于在第二个命令中使用了<
,系统将cat
的stdin
替换为a.txt
的文件流。