Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl';s系统()?_Perl_Bash_Command - Fatal编程技术网

如何在Perl';s系统()?

如何在Perl';s系统()?,perl,bash,command,Perl,Bash,Command,如何在Perl的system()命令中使用bash语法 我有一个特定于bash的命令,例如下面的命令,它使用bash的进程替换: diff <(ls -l) <(ls -al) system(“bash-c'diff告诉Perl直接调用bash。使用的list变体可以降低引用的复杂性: my @args = ( "bash", "-c", "diff <(ls -l) <(ls -al)" ); system(@args); my@args=(“bash”、“-c”

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

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

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

system(“bash-c'diff告诉Perl直接调用bash。使用的
list
变体可以降低引用的复杂性:

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

my@args=(“bash”、“-c”、“diffvladr回答的问题是系统不会从命令捕获到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;
}

my@cmd=('diff我更喜欢在perl中执行带倒勾“`”的bash命令。这样我可以得到一个返回值,例如:

my $value = \`ls`;

此外,我不必只使用“bash-c”来运行commmand.Works。受@errat.info中答案的启发,我创建了一些更简单的东西并为我工作:

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

my$line=“blastn-subject这也会阻止你调用/bin/sh来运行bash shift在这里是如何工作的?它是与$[0]相同还是更好?@Janis:
shift
会弹出
@
中的第一个元素,即
$[0]
,并返回它。因此效果与使用
$[0]相同
,再加上修改
@
,这在这里并不重要。
sub system_bash {
  my @args = ( "bash", "-c", shift );
  system(@args);
}

system_bash('echo $SHELL');
system_bash('diff <(ls -l) <(ls -al)');
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;
}
my $value = \`ls`;
my $line="blastn -subject <(echo -e \"$seq1\") -query <(echo -e \"$seq2\") -outfmt 6";
my $result=qx(bash -c '$line');
print "$result\n";