【问题标题】:Do some programs not accept process substitution for input files?某些程序不接受输入文件的进程替换吗?
【发布时间】:2011-05-15 12:31:20
【问题描述】:

我正在尝试对程序的输入文件使用进程替换,但它不起作用。是不是因为某些程序不允许进程替换输入文件?

以下不起作用:

bash -c "cat meaningless_name"
    >sequence1
    gattacagattacagattacagattacagattacagattacagattacagattaca
    >sequence2
    gattacagattacagattacagattacagattacagattacagattacagattaca
bash -c "clustalw -align -infile=<(cat meaningless_name) -outfile=output_alignment.aln -newtree=output_tree.dnd"
    (Less verbose output, finishing with:
    No sequences in file. No alignment!

但以下控件确实有效:

bash -c "clustalw -align -infile=meaningless_name -outfile=output_alignment.aln -newtree=output_tree.dnd"
    (Verbose output, finishing with:
    CLUSTAL-Alignment file created  [output_alignment.aln]
bash -c "cat <(cat meaningless_name) > meaningless_name2"
diff meaningless_name meaningless_name2
    (No output: the two files are the same)
bash -c "clustalw -align -infile=meaningless_name2 -outfile=output_alignment.aln -newtree=output_tree.dnd"
    (Verbose output, finishing with:
    CLUSTAL-Alignment file created  [output_alignment.aln]

这表明进程替换本身有效,但 clustalw 程序本身不喜欢进程替换 - 可能是因为它创建了一个非标准文件,或者创建了具有异常文件名的文件。

程序不接受进程替换是否很常见?我将如何检查这是否是问题所在?

我在 Ubuntu 9.10 上运行 GNU bash 版本 4.0.33(1)-release (x86_64-pc-linux-gnu)。 Clustalw 是 2.0.10 版。

【问题讨论】:

    标签: bash unix ipc process-substitution


    【解决方案1】:

    进程替换创建一个命名管道。您无法搜索命名管道。

    【讨论】:

      【解决方案2】:

      是的。我在其他程序中注意到了同样的事情。例如,它在 emacs 中也不起作用。它给出“文件存在但无法读取”。这绝对是一个特殊的文件,对我来说/proc/self/fd/some_number。在 lessmost 中,使用默认设置时,它可靠工作。

      对于大多数人来说:

      most <(/bin/echo 'abcdef')
      

      和更短的不显示任何内容。较长的值会截断开头。 less 显然有效,但前提是您指定 -f

      我发现 zsh 的 = 在实践中更有用。除了 = 而不是 &lt; 之外,它在语法上是相同的。但它只是创建一个临时文件,因此支持不依赖于程序。

      编辑:

      我发现 zsh 使用TMPPREFIX 来选择临时文件名。所以即使你不希望你真正的/tmptmpfs,你也可以为 zsh 挂载一个。

      【讨论】:

      • 临时文件是硬盘上的文件,还是仅在 RAM 中?我希望避免撞到硬盘。
      • 对我来说是/tmp/zshXXX。所以你可以很容易地使用tmpfs
      • [zsh 进程替换文档](zsh.sourceforge.net/Doc/Release/Expansion.html#SEC67) 详细介绍了程序在使用&lt;() 形式的进程重定向时可能遇到的一些问题:期待 lseek(2 ) 工作,在处理参数之前关闭 fds(可能的安全功能),如果命令从不读取替换的 fd,则挂起子进程。对于这个问题,第一个似乎最有可能。
      • 电脑没有zsh(我打算改用/dev/shm写我正在使用的文件),但是为了我这种情况的其他人的利益:有没有风险如果我修改TMPPREFIX,它将改变所有新临时文件的保存位置,而不仅仅是使用=(echo 'foo')创建的那些?
      • @Andrew,文档说 zsh(而不是其他程序)将它用于所有临时文件。我不知道 zsh 将使用此类文件的其他任何情况。
      猜你喜欢
      • 2021-07-09
      • 1970-01-01
      • 2018-11-22
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      相关资源
      最近更新 更多