有几个unix命令可以在两个文件上运行。通常这样的命令允许通过使用单个破折号代替文件名从标准输入读取其中一个“文件”的内容。
我刚遇到a technique似乎允许从标准输入读取两个文件:
comm -12 <(sort file1) <(sort file2)
我最初的不相信的反应是,“这不应该工作。标准输入将只有两个文件的串联。命令将无法区分文件或甚至意识到已经给出了文件的内容两个文件。“
当然,这种结构确实有效。我在cygwin 1.7.7上使用bash 3.2.51对comm
和diff
进行了测试。我很好奇它是如何以及为什么有效:
答案 0 :(得分:10)
Bash,Korn shell(ksh93,无论如何)和Z shell都支持process substitution。这些文件显示为实用程序的文件。试试这个:
$ bash -c 'echo <(echo)'
/dev/fd/63
$ ksh -c 'echo <(echo)'
/dev/fd/4
$ zsh -c 'echo <(echo)'
/proc/self/fd/12
您将看到与所示文件描述符类似的文件描述符。
答案 1 :(得分:6)
这是标准的Bash扩展。 <(sort file1)
打开一个带有sort file1
命令输出的管道,为管道提供临时文件名,并在comm
命令行上传递该临时文件名。
您可以通过echo
告诉您传递给该计划的内容来了解其工作原理:
echo <(sort file1) <(sort file2)