use Carp;
sub btck ($)
{
# Like backticks but the error check and chomp() are integrated
my $cmd = shift;
my $result = `$cmd`;
$? == 0 or confess "backtick command '$cmd' returned non-zero";
chomp($result);
return $result;
}
sub bash_btck ($)
{
# Like backticks but use bash and the error check and chomp() are
# integrated
my $cmd = shift;
my $sqpc = $cmd; # Single-Quote-Protected Command
$sqpc =~ s/'/'"'"'/g;
my $bc = "bash -c '$sqpc'";
return btck($bc);
}
7条答案
按热度按时间hmae6n7t1#
"系统shell"通常是不可变的。请参见perldoc -f exec:
如果LIST中有多个参数,或者LIST是具有多个值的数组,则调用execvp(3)如果只有一个标量参数或者数组只有一个元素,则检查参数中的shell元字符,如果有,整个参数传递给系统的命令shell进行解析(在Unix平台上为"/bin/sh-c ",但在其他平台上会有所不同)。
如果您确实需要bash来执行特定任务,请考虑显式调用它:
或者甚至:
您也可以将bash命令放入一个. sh文件中并直接调用它:
0sgqnhkj2#
试试看
我相当肯定-c的参数是像bash解释它的命令行那样解释的,诀窍是保护它不受
sh
的影响--这就是引号的作用。dw1jzc5e3#
这个例子对我很有效:
wrrgggsh4#
为了处理运行bash和嵌套引号,本文提供了最佳解决方案:How can I use bash syntax in Perl's system()?
8mmmxcuj5#
我原以为
perl
会荣誉$SHELL
变量,但后来我突然想到,它的行为实际上可能取决于系统的exec
实现。将执行shell(/bin/sh),并将文件路径作为其第一个参数。
你总是可以做
qw/bash your-command/
的,不是吗?z4bn682m6#
创建Perl子例程:
并使用它如下:
或者使用perl here-doc执行多行命令:
gg0vcinb7#
我想创建一些函数
btck
(集成了错误检查)和bash_btck
(使用bash):我喜欢使用bash的原因之一是为了安全管道行为: