【问题标题】:How make open function use bash instead of sh?如何让 open 函数使用 bash 而不是 sh?
【发布时间】:2021-01-24 09:36:29
【问题描述】:

当我使用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 函数一起使用?

【问题讨论】:

  • 一个可能对您有帮助的相关问题:Which shell does a Perl system() call use?
  • @Pierre :除了tripleee 给出的正确答案之外,您看到的错误可能来自PATH 环境变量的错误设置。我建议,为了测试,你在运行命令之前打印它的值。
  • @user1934428 不,将bash 直接放在前面只会导致bash 尝试将ps 作为脚本文件执行。
  • @tripleee - 对,我应该正确阅读错误消息。或者当然-c 不见了。

标签: bash perl pipe


【解决方案1】:

您可以改为显式运行bash

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

cmd 不是完全微不足道或不受您控制时,另一个答案确实显示了一些重要的最佳实践。

【讨论】:

  • 这仍然会调用sh -c 来运行bash -c(因为单引号)。
【解决方案2】:

不要在引用注入中冒险:

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

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

【讨论】:

    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2014-01-18
    • 1970-01-01
    • 2013-02-01
    相关资源
    最近更新 更多