繁体   English   中英

如何在Perl的system()中使用bash语法?

[英]How can I use bash syntax in Perl's system()?

如何在Perl的system()命令中使用bash语法?

我有一个特定于bash的命令,例如以下命令,它使用bash的进程替换:

 diff <(ls -l) <(ls -al)

我想用Perl来调用它

 system("diff <(ls -l) <(ls -al)")

但它给了我一个错误,因为它使用sh而不是bash来执行命令:

sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `sort <(ls)'

告诉Perl直接调用bash。 使用system()list变量来降低引用的复杂性:

my @args = ( "bash", "-c", "diff <(ls -l) <(ls -al)" );
system(@args);

如果你打算经常这样做,你甚至可以定义一个子程序:

sub system_bash {
  my @args = ( "bash", "-c", shift );
  system(@args);
}

system_bash('echo $SHELL');
system_bash('diff <(ls -l) <(ls -al)');
 system("bash -c 'diff <(ls -l) <(ls -al)'")

理论上应该这样做。 根据手册页,Bash的-c选项允许您传递shell命令以执行。

vladr的答案的问题是系统不会从命令(你通常想要的)捕获输出到STDOUT,并且它也不允许执行多个命令(给定使用shift而不是访问完整的命令) @_)的内容。

像下面这样的东西可能更适合这个问题:

my @cmd = ( 'diff <(ls -l) <(ls -al)', 'grep fu' );
my @stdout = exec_cmd( @cmd );
print join( "\n", @stdout );

sub exec_cmd
{
    my $cmd_str = join( ' | ', @_ );
    my @result = qx( bash -c '$cmd_str' );
    die "Failed to exec $cmd_str: $!" unless( $? == 0 && @result );
    return @result;
}

不幸的是,这不会阻止你调用/ bin / sh只是为了运行bash,但是我没有看到解决这个问题的方法。

我更喜欢用反引号“`”在perl中执行bash命令。 这样我得到一个返回值,例如:

my $value = \`ls`;

此外,我不必使用“bash -c”来运行命令。 适合我。

受到@ errant.info答案的启发,我创造了一些更简单的东西并为我工作:

my $line="blastn -subject <(echo -e \"$seq1\") -query <(echo -e \"$seq2\") -outfmt 6";
my $result=qx(bash -c '$line');
print "$result\n";

引入的$ line变量允许每次修改输入($ seq1和$ seq2)。 希望能帮助到你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM