如何让 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
如何将 bash
与 open
函数一起使用?
您可以显式 运行 bash
代替。
open($fcd, "bash -c '$cmd' |");
另一个答案确实显示了一些重要的最佳实践,适用于 cmd
并非完全微不足道或不受您控制的情况。
不要冒险使用引号注入:
open my $fcmd, '-|', qw(bash -c), $cmd;
(另请注意,如果您使用 my
声明它,则无需显式关闭 $fcmd
;它会在块结束时自动关闭;perl 不是 java;-))
我想在使用 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
如何将 bash
与 open
函数一起使用?
您可以显式 运行 bash
代替。
open($fcd, "bash -c '$cmd' |");
另一个答案确实显示了一些重要的最佳实践,适用于 cmd
并非完全微不足道或不受您控制的情况。
不要冒险使用引号注入:
open my $fcmd, '-|', qw(bash -c), $cmd;
(另请注意,如果您使用 my
声明它,则无需显式关闭 $fcmd
;它会在块结束时自动关闭;perl 不是 java;-))