如何让 open 函数使用 bash 而不是 sh?

How make open function use bash instead of sh?

我想在使用 open 函数时使用 bash 而不是 sh。例如:

sub run_cmd {
    my ($cmd) = @_;
    my $fcmd;

    print("Run $cmd\n");

    open($fcmd, "$cmd |");
    while ( my $line = <$fcmd> ) {
        print "-> $line";
    }
    close $fcmd;
}

eval{run_cmd('ps -p $$')};

这里,输出是:

Run ps -p $$
->    PID TTY          TIME CMD
-> 189493 pts/6    00:00:00 sh

我们可以看到默认使用sh

我有一些限制,我需要 (1) 使用 open 函数和 (2) 调用 bash 而不是 sh。我试着简单地在我的命令开头添加 bash 但它不起作用:

Run ps -p $$
/bin/ps: /bin/ps: cannot execute binary file

如何将 bashopen 函数一起使用?

您可以显式 运行 bash 代替。

open($fcd, "bash -c '$cmd' |");

另一个答案确实显示了一些重要的最佳实践,适用于 cmd 并非完全微不足道或不受您控制的情况。

不要冒险使用引号注入:

open my $fcmd, '-|', qw(bash -c), $cmd;

(另请注意,如果您使用 my 声明它,则无需显式关闭 $fcmd;它会在块结束时自动关闭;perl 不是 java;-))