【问题标题】:Perl issues bash pipe into JavaPerl 将 bash 管道发送到 Java
【发布时间】:2012-08-23 20:10:29
【问题描述】:

我是 Perl 初学者。我有这个 Perl sn-p

$normal_pileup = "samtools mpileup -q 1 -f XXXX YYYYY";
$tumor_pileup = "samtools mpileup -q 1 -f XXXX ZZZZZ";

bash -c \"java -jar ttt.jar  <\($normal_pileup\) <\($tumor_pileup\) output

他们尝试发出系统调用,将这些命令的输入通过管道传输到 Java 程序中。我无法让它工作。谁能告诉我怎么做?

【问题讨论】:

  • 'bash -c...' 行是 perl 脚本的一部分吗?对我来说,它看起来不像是有效的 perl。

标签: java perl bash pipe


【解决方案1】:

您不能直接从 Perl 调用 bash。但是,如果您使用 system,则会调用 /bin/sh,这可能不支持进程替换。

一种可能的解决方法是

system qq(echo 'java -jar ttt.jar  <($normal_pileup) <($tumor_pileup) output' | bash);

【讨论】:

    【解决方案2】:
    $normal_pileup = "samtools mpileup -q 1 -f XXXX YYYYY";
    

    不会执行任何命令,只会将samtools mpileup -q 1 -f XXXX YYYYY 存储为字符串。 $tumor_pileup 也一样。

    如果你想执行命令使用

    $normal_pileup = `samtools mpileup -q 1 -f XXXX YYYYY`;
    

    bash 不是 Perl 命令。

    `java -jar ttt.jar  ...`
    

    你的“java”也很可能是错的

    • 使用&lt; 指定读取STDIN 的位置。应该是一个文件,但在您的情况下,您正在指定上一个命令的输出。这仅在samtool 的输出是文件名时才有效。

    • 如果你想让你的 java 程序处理另一个命令的输出,你需要一个管道

      mycommand | java
      

    总结一下,我想你想要

    ` ( samtools mpileup -q 1 -f XXXX YYYYY; samtools mpileup -q 1 -f XXXX ZZZZZ ) | java -jar ttt.jar output `
    

    【讨论】:

    • 非常感谢您的回复。我的意图是运行两个 bash 命令“samtools mpileup -q 1 -f XXXX YYYYY”和samtools mpileup -q 1 -f XXXX YYYYY。它们的输出将作为两个参数直接传送到 java 程序中。
    • @user1632530 所以两者都不会生成数据流而只是一个字符串?你能给我们一个示例输出吗?
    • 问题出在 varscan 的使用上。原始网址是varscan.sourceforge.net/somatic-calling.html
    猜你喜欢
    • 2023-03-11
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2015-07-14
    相关资源
    最近更新 更多