【问题标题】:paste without temporary files in Unix在 Unix 中粘贴没有临时文件
【发布时间】:2010-12-06 21:13:51
【问题描述】:

我正在尝试使用 Unix 命令粘贴,它类似于 cat 的列附加形式,但遇到了一个我从不知道如何在 Unix 中解决的难题。

如何使用两个不同程序的输出作为另一个程序的输入(不使用临时文件)?

理想情况下,我会这样做(不使用临时文件):

./progA > tmpA; ./progB > tmpB;粘贴 tmpA tmpB

这对我来说似乎比较频繁,但我不知道如何使用两个不同程序(progAprogB)的输出作为输入到另一个不使用临时文件(tmpAtmpB)。

对于 paste 之类的命令,仅使用 paste $(./progA) $(./progB) (以 bash 表示法)不会成功,因为它可以从文件或标准输入中读取.

我对临时文件持谨慎态度的原因是我不想让作业并行运行而导致使用同一个文件出现问题;确保唯一的文件名有时很困难。

我目前正在使用 bash,但很想知道任何 Unix shell 的解决方案。

最重要的是,我是否以正确的方式解决问题?


干杯!

【问题讨论】:

    标签: unix shell redirect pipe


    【解决方案1】:

    bash 下不需要临时文件,试试这个:

    paste <(./progA) <(./progB)
    

    请参阅 Bash 手册中的 "Process Substitution"

    【讨论】:

      【解决方案2】:

      像这样使用命名管道 (FIFO):

      mkfifo fA
      mkfifo fB
      progA > fA &
      progB > fB &
      paste fA fB
      rm fA fB
      

      Bash 的进程替换透明地做类似的事情,所以只有在你有不同的 shell 时才使用它。

      【讨论】:

      • 实际上,Bash 使用匿名管道并在支持它的平台上替换 /dev/fd/## -- 它不会在 Linux 上创建临时命名管道。
      【解决方案3】:

      适用于所有外壳。

      {
      progA
      progB
      } | paste
      

      【讨论】:

      • 这不是真正的粘贴,它会以并排的方式组合线条。在此命令的情况下, progA 和 progB 的输出被连接起来。你也可以省略| paste,因为它和| cat一样没用
      【解决方案4】:

      天哪,我最近发现,在某些情况下,如果您在 bash 脚本中设置以下内容(如果需要的话),您可以让您的进程替换工作:

      set +o posix

      http://www.linuxjournal.com/content/shell-process-redirection

      来自链接: “进程替换不是 POSIX 兼容的功能,因此可能必须通过以下方式启用它:set +o posix” 我被困了好几个小时,直到我完成了这个。希望这个额外的花絮会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-06
        • 1970-01-01
        • 2022-12-18
        • 1970-01-01
        • 2012-01-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多