管道有问题

管道有问题

为什么我不能做这样的事情:

tail -n 5 small.txt | diff small.txt

我想传递第一个命令的执行结果,就像第二个命令的第二个参数一样,而不是独立的输入。我该怎么做?

答案1

尝试这个...

  diff small.txt <(tail -n 5 small.txt)

答案2

尝试tail -n 5 small.txt | diff small.txt -

man diff

如果 FILE 为“-”,则读取标准输入。

-方法向您展示如何正确地做您想做的事情。但下面的方法会教你一些东西,让你的(shell)生活更轻松:

diff small.txt <(tail -n 5 small.txt)

答案3

您无法按照您建议的方式编写管道的原因是该diff实用程序在命令行上需要两个输入文件,并且默认情况下不会从其标准输入流(来自 的输出tail)读取。

您可以通过添加第二个“文件”参数(或第一个,取决于您想要比较文件的顺序)来指示diff从标准输入读取:-

tail -n 5 small.txt | diff small.txt -

diff将检测-文件名并从tail命令中读取而不是从第二个文件中读取。这是由一些实用程序(例如diffcatpaste等)实现的语义,但不是通用的(shell 不知道-“与标准输入相同”)。

bash和其他支持的外壳中流程替代使用<( ... ),可以指示 shell 创建一个临时文件(或 FIFO),其中包含特定命令的输出:

diff small.txt <( tail -n 5 small.txt )

这是本质上(但技术上不是)与

tail -n 5 small.txt >tmpfile
diff small.txt tmpfile
rm -f tmpfile

相关内容