如何让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
相关产品推荐
相关产品推荐

