如何获取未修改的命令行参数以“换行”另一个命令行工具?

时间:2009-11-19 18:56:04

标签: perl bash command-line

我想编写一个脚本foo,它只是使用Bash或Perl调用bar与调用的完全相同的参数。

现在,在perl中执行此操作的简单方法是

#!/bin/perl

my $args=join(' ', @ARGV);
`bar $args`;

但是,ARGV中的值已经由shell处理,因此如果我调用

 foo "I wonder, \"does this work\""

bar会像这样被调用

 bar I wonder "does this work"

如何获取原始命令行,以便我可以简单地逐字传递它?

3 个答案:

答案 0 :(得分:12)

在shell处理perl可执行文件之前,您无法获取它们的参数。但是,您可以确保shell不再处理它们

system('bar', @ARGV);

VS

system("bar @ARGV");

请参阅perldoc -f system

  

如果有的话                  只有一个标量参数,检查参数是否为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;

有许多方法可以调用Perl中的程序;有关主要选项的详细概述,请参阅What's the difference between Perl's backticks, system, and exec?

答案 1 :(得分:3)

这非常简单。查看系统调用的系统(LIST)变体。

system('bar', @ARGV);

perldoc -f system

答案 2 :(得分:3)

在bash中:

exec bar "$@"

这会保留参数中的间距。但是,I / O重定向不是术语含义内的参数(但是对于原始调用执行的I / O重定向将持续到调用的'bar'命令,除非您更改它。)