16

如何bash在 Perl 的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)'
4

5 回答 5

50

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

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)');
于 2009-02-20T21:55:43.217 回答
6
 system("bash -c 'diff <(ls -l) <(ls -al)'")

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

于 2009-02-20T21:54:15.873 回答
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,但是我没有看到解决此问题的方法。

于 2012-08-29T01:35:09.767 回答
0

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

my $value = \`ls`;

另外,我不必使用“bash -c”来运行命令。为我工作。

于 2012-12-18T00:58:26.937 回答
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)。希望能帮助到你!

于 2017-02-19T17:17:52.450 回答