[英]How can I use the shell's process substitution in Perl's system()?
[英]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.