You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Perl的open函数调用bash而非默认的sh?

在Perl中使用open函数调用bash而非sh的解决方案

你遇到的问题是因为直接在命令前加bash的方式不对——bash会把后面的ps当作要执行的脚本文件,而不是命令参数,所以才会抛出"cannot execute binary file"的错误。要让bash正确执行你的命令,需要用bash -c参数来指定要执行的命令字符串。

这里有两种可行的方案:

方案1:修改run_cmd函数,默认用bash执行所有命令

直接在open调用中加入bash -c来包裹原命令,这样所有通过run_cmd执行的命令都会由bash处理:

sub run_cmd { 
    my ($cmd) = @_; 
    my $fcmd; 
    print("Run $cmd\n"); 
    # 用bash -c执行命令,注意转义单引号(如果命令里有单引号需要额外处理)
    open($fcmd, "bash -c '$cmd' |"); 
    while ( my $line = <$fcmd> ) { 
        print "-> $line"; 
    } 
    close $fcmd; 
}

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

执行后你会看到输出里的CMD变成bash:

Run ps -p $$
-> PID TTY TIME CMD
-> 12345 pts/6 00:00:00 bash

方案2:调用时指定bash执行单个命令

如果你不想修改run_cmd函数,也可以在传入命令时直接用bash -c包裹:

sub run_cmd { 
    my ($cmd) = @_; 
    my $fcmd; 
    print("Run $cmd\n"); 
    open($fcmd, "$cmd |"); 
    while ( my $line = <$fcmd> ) { 
        print "-> $line"; 
    } 
    close $fcmd; 
}

# 使用q{}避免引号转义问题
eval{run_cmd(q{bash -c 'ps -p $$'})};

注意事项

如果你的命令中包含单引号,需要对单引号进行转义(比如把'换成'\''),避免bash解析出错。比如如果命令是echo 'hello world',需要写成:

run_cmd(q{bash -c 'echo '\''hello world'\'''})

内容的提问来源于stack exchange,提问作者Pierre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:47:35