为什么我不能做这样的事情:
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
命令中读取而不是从第二个文件中读取。这是由一些实用程序(例如diff
、cat
、paste
等)实现的语义,但不是通用的(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