Pau*_*xon 5 bash perl command-line
我想编写一个脚本foo这只是调用bar它被称为用,使用bash或Perl完全相同的参数.
现在,在perl中执行此操作的简单方法是
#!/bin/perl
my $args=join(' ', @ARGV);
`bar $args`;
Run Code Online (Sandbox Code Playgroud)
但是,ARGV中的值已经由shell处理,因此如果我打电话
foo "I wonder, \"does this work\""
Run Code Online (Sandbox Code Playgroud)
酒吧会被这样打电话
bar I wonder "does this work"
Run Code Online (Sandbox Code Playgroud)
如何获取原始命令行,以便我可以简单地逐字传递它?
Eth*_*her 12
在shell处理perl可执行文件之前,您无法获取它们的参数.但是,您可以确保shell不会再次处理它们:
system('bar', @ARGV);
Run Code Online (Sandbox Code Playgroud)
与
system("bar @ARGV");
Run Code Online (Sandbox Code Playgroud)
如果只有一个标量参数,则检查参数是否为shell元字符,如果有,则将整个参数传递给系统的命令shell进行解析(在Unix平台上这是"/ bin/sh -c",但是在其他平台上有所不同).如果参数中没有shell元字符,则将其拆分为单词并直接传递给"execvp",这样效率更高.
如果需要读取程序的输出,请使用进程句柄并以相同的方式传递参数(无插值):
open my $barhandle, '-|', 'bar', @ARGV or die "Can't call bar: $!";
while (my $line = <$barhandle>)
{
# do something with $line...
}
close $barhandle;
Run Code Online (Sandbox Code Playgroud)
你可以通过很多方式调用Perl中的程序; 看看Perl的反引号,系统和exec有什么区别?有关主要选项的概述.