perl反引号:使用bash而不是sh

Dav*_*d B 6 bash shell perl sh backticks

我注意到当我在perl中使用反引号时,命令是使用sh执行的,而不是使用bash执行,给我一些问题.

我怎样才能改变这种行为,以便perl使用bash?

PS.我正在尝试运行的命令是:

paste filename <(cut -d \" \" -f 2 filename2 | grep -v mean) >> filename3
Run Code Online (Sandbox Code Playgroud)

Eth*_*her 7

"系统外壳"通常不可变.见perldoc -f exec:

如果LIST中有多个参数,或者LIST是一个具有多个值的数组,则使用LIST中的参数调用execvp(3).如果只有一个标量参数或一个包含一个元素的数组,则检查参数是否为shell元字符,如果有,则将整个参数传递给系统的命令shell进行解析(这是"/ bin/sh") -c"在Unix平台上,但在其他平台上有所不同).

如果您确实需要使用bash来执行特定任务,请考虑明确调用它:

my $result = `/usr/bin/bash command arguments`;
Run Code Online (Sandbox Code Playgroud)

甚至:

open my $bash_handle, '| /usr/bin/bash' or die "Cannot open bash: $!";
print $bash_handle 'command arguments';
Run Code Online (Sandbox Code Playgroud)

您还可以将bash命令放入.sh文件中并直接调用它:

my $result = `/usr/bin/bash script.pl`;
Run Code Online (Sandbox Code Playgroud)


小智 7

尝试

`bash -c \"your command with args\"`
Run Code Online (Sandbox Code Playgroud)

我很确定-c的参数被解释为bash解释其命令行的方式.诀窍是保护它sh- 这就是引用的目的.


Pau*_*ce. 5

这个例子对我有用:

$ perl -e 'print `/bin/bash -c "echo <(pwd)"`'
/dev/fd/63
Run Code Online (Sandbox Code Playgroud)