将两个文件重定向到标准输入

时间:2011-01-19 16:22:07

标签: bash redirect sh

有几个unix命令可以在两个文件上运行。通常这样的命令允许通过使用单个破折号代替文件名从标准输入读取其中一个“文件”的内容。

我刚遇到a technique似乎允许从标准输入读取两个文件:

comm -12 <(sort file1) <(sort file2)

我最初的不相信的反应是,“这不应该工作。标准输入将只有两个文件的串联。命令将无法区分文件或甚至意识到已经给出了文件的内容两个文件。“

当然,这种结构确实有效。我在cygwin 1.7.7上使用bash 3.2.51对commdiff进行了测试。我很好奇它是如何以及为什么有效:

  • 为什么这样做?
  • 这是一个Bash扩展,还是这个直接的Bourne shell功能?
  • 这适用于我的系统,但这种技术是否适用于其他平台? (换句话说,使用这种技术编写的脚本是可移植的吗?)

2 个答案:

答案 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)