【问题标题】:Redirecting two files to standard input将两个文件重定向到标准输入
【发布时间】:2011-06-11 21:19:17
【问题描述】:

有几个 unix 命令旨在对两个文件进行操作。通常,此类命令允许通过使用单个破折号代替文件名从标准输入中读取“文件”之一的内容。

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

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

我最初不相信的反应是,“那不应该工作。标准输入将只有两个文件的串联。该命令将无法区分文件,甚至意识到它已被赋予两个文件。”

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

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

【问题讨论】:

    标签: bash redirect sh


    【解决方案1】:

    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
    

    您会看到与所示类似的文件描述符。

    【讨论】:

    • 就是这样——进程替换!我花了很多时间在谷歌上搜索有关重定向的信息,但我只是输入了错误的名称。
    • 谢谢。这有帮助。已确认的 ksh88(在 AIX 7.1 上)不支持这种类型的进程替换。感谢 Ganesh 的 bash。
    【解决方案2】:

    这是一个标准的 Bash 扩展。 &lt;(sort file1) 使用sort file1 命令的输出打开一个管道,为管道提供一个临时文件名,然后在comm 命令行上传递该临时文件名。

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

    echo <(sort file1) <(sort file2)
    

    【讨论】:

      猜你喜欢
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 2020-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多