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

Pie*_*rre 3 bash perl pipe

我想使用bash而不是sh当我使用该open功能时。例如:

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 Code Online (Sandbox Code Playgroud)

在这里,输出是:

Run ps -p $$
->    PID TTY          TIME CMD
-> 189493 pts/6    00:00:00 sh
Run Code Online (Sandbox Code Playgroud)

我们可以看到sh是默认使用的。

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

Run ps -p $$
/bin/ps: /bin/ps: cannot execute binary file
Run Code Online (Sandbox Code Playgroud)

我可以做什么来使用bashopen功能?

tri*_*eee 5

您可以显式运行bash

open($fcd, "bash -c '$cmd' |");
Run Code Online (Sandbox Code Playgroud)

另一个答案确实显示了一些重要的最佳实践,用于何时cmd并非完全无关紧要或不受您控制。