如何在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)'
答案 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)。 希望它有所帮助!