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

Bob*_*off 14 bash redirect sh

有几个unix命令设计用于对两个文件进行操作.通常,这样的命令允许通过使用单个破折号代替文件名从标准输入读取其中一个"文件"的内容.

我刚刚遇到一种似乎允许从标准输入读取两个文件的技术:

comm -12 <(sort file1) <(sort file2)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Pau*_*ce. 10

Bash,Korn shell(ksh93,无论如何)和Z shell都支持进程替换.这些文件显示为实用程序的文件.试试这个:

$ bash -c 'echo <(echo)'
/dev/fd/63
$ ksh -c 'echo <(echo)'
/dev/fd/4
$ zsh -c 'echo <(echo)'
/proc/self/fd/12
Run Code Online (Sandbox Code Playgroud)

您将看到与所示文件描述符类似的文件描述符.


Tim*_*son 6

这是标准的Bash扩展.<(sort file1)使用sort file1命令的输出打开管道,为管道提供临时文件名,并在comm命令行上传递该临时文件名.

你可以通过echo告诉你传递给程序的内容来了解它是如何工作的:

echo <(sort file1) <(sort file2)
Run Code Online (Sandbox Code Playgroud)