代码之家  ›  专栏  ›  技术社区  ›  Andrew Grimm Alex Wayne

某些程序不接受输入文件的进程替换吗?

  •  4
  • Andrew Grimm Alex Wayne  · 技术社区  · 15 年前

    我试图用进程替换程序的输入文件,但它不起作用。是因为有些程序不允许进程替换输入文件吗?

    以下操作不起作用:

    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上运行gnubashversion4.0.33(1)-release(x86_64-pc-linux-GNU)。Clustalw是2.0.10版。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Matthew Flaschen    15 年前

    对。我在其他节目中也注意到了同样的事情。例如,它在emacs中也不起作用。它给出了“文件存在但不能读取”。对我来说,这绝对是一个特殊的文件 /proc/self/fd/some_number . 它不起作用 可靠的 在任何一个 less 也不是 most ,使用默认设置。

    对大多数人来说:

    most <(/bin/echo 'abcdef')
    

    而shorter什么也不显示。较长的值会截断开头。 较少的 显然有效,但前提是 -f .

    我找到了zsh's = 在实践中更有用。在句法上是一样的,除了 = 而不是 < . 但它只是创建一个临时文件,所以支持并不依赖于程序。

    编辑:

    我发现了zsh的用途 TMPPREFIX 选择临时文件名。所以即使你不想要你真正的 /tmp 成为 tmpfs ,您可以为zsh安装一个。

        2
  •  7
  •   Dennis Williamson    15 年前

    进程替换创建命名管道。你不能在一个命名的管道里寻找。