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

时间:2009-02-20 21:50:23

标签: perl bash command

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

我有一个特定于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)'

5 个答案:

答案 0 :(得分:46)

告诉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)');

答案 1 :(得分:6)

 system("bash -c 'diff <(ls -l) <(ls -al)'")

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

答案 2 :(得分:4)

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,但是我没有看到解决这个问题的方法。

答案 3 :(得分:0)

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

my $value = \`ls`;

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

答案 4 :(得分:0)

受到@ 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)。 希望它有所帮助!