具有空格的命令行参数的Perl脚本

时间:2009-08-12 18:19:30

标签: linux perl

我觉得我错过了一些非常明显的东西,但我似乎无法弄清楚发生了什么。我有一个perl脚本,我从C代码调用。脚本+参数是这样的:

my_script "/some/file/path" "arg" "arg with spaces" "arg" "/some/other/file"

当我在Windows中运行它时,Perl正确地将其识别为5个参数,而当我在SunOS Unix机器上运行它时,它识别出8,将具有空格的arg拆分为单独的args。

不确定它是否有任何区别,但在Windows中我运行它:

perl my_script <args>

在Unix中,我只是像上面的show那样运行它。

任何想法为什么Unix没有正确管理这个论点?

编辑:

以下是调用perl脚本的代码:

 char cmd[1000];
 char *script = "my_script";
 char *argument = "\"arg1\" \"arg2\" \"arg3 with spaces\" \"arg4\" \"arg5\"";
 sprintf( cmd, "%s %s >1 /dev/null 2>&1", script, arguments);
 system( cmd );

这不完全是,因为我动态地构建了参数字符串,但这就是要点。

另外,这是我在下面阅读参数的代码:

($arg1, $arg2, $arg3, $arg4, $arg5) = @ARGV;

我知道它太天真了,但是这个脚本只能从C应用程序运行,因此不需要

4 个答案:

答案 0 :(得分:3)

据推测

system("my_script \"/some/file/path\" \"arg\" \"arg with spaces\" \"arg\" \"/some/other/file\");

导致一切都经过bash(因为需要解释shebang线,吃掉你传递的引号)。同样,大概可以通过直接调用perl而不是依靠shell来找到它来避免问题(尽管如果路径上的perl与提供的路径上的char *argument = "\"arg1\" \"arg2\" \"arg3 with spaces\" \"arg4\" \"arg5\""; 不同,这可能会有问题。 shebang line)。

<强>更新

鉴于你:

char *argument = "\\\"arg1\\\" \\\"arg2\\\" \\\"arg3 with spaces\\\" \\\"arg4\\\" \\\"arg5\\\"";

您可能想尝试:

argument

另一次更新:

感谢您接受我的回答,但是,我的整个理论可能都是错误的。

我在GNU bash, version 4.0.28(2)-release (i686-pc-linux-gnu)尝试了上面argument的双重反击版本,最终传递了

[sinan@kas src]$ ./t
'"arg1"'
'"arg2"'
'"arg3'
'with'
'spaces"'
'"arg4"'
'"arg5"'

而原始的bash就像一个魅力。我有点困惑。也许SUN上的shell不是{{1}}或者可能还有其他事情发生。

答案 1 :(得分:1)

您是否忘记了SunOS上的引用?

如果你这样做

perl script arg1 arg2 "arg3 with spaces" arg4 arg5
你应该好。否则,请尝试切换shell。

答案 2 :(得分:1)

既然问题已经更新,我仍然无法重现您的结果:

~% cat test.c
#include <stdio.h>
#include <stdlib.h>
int main(void){
        char cmd[1000];
        char *script = "./my_script";
        char *arguments = "\"arg1\" \"arg2\" \"arg3 with spaces\" \"arg4\" \"arg5\"";
        sprintf( cmd, "%s %s", script, arguments);
        system( cmd );
        return 0;
}

~% cat my_script
#!/usr/bin/perl
($arg1, $arg2, $arg3, $arg4, $arg5) = @ARGV;
print "arg1 = $arg1\n";
print "arg2 = $arg2\n";
print "arg3 = $arg3\n";
print "arg4 = $arg4\n";
print "arg5 = $arg5\n";

~% gcc test.c

~% ./a.out
arg1 = arg1
arg2 = arg2
arg3 = arg3 with spaces
arg4 = arg4
arg5 = arg5

~%

您的配置还有其他功能。


上一个回答:

  

Unix shell解释引用的参数   作为一个论点。你可以做一个   快速测试:

for i in a b "c d e" f; do echo $i; done
     

结果就是你所期望的   be:“c d e”被视为一个单一的   参数。

     

我觉得你的问题很严重   脚本,在参数处理中   逻辑。

答案 3 :(得分:0)

SunOS内核对shebang口译员的处理是否可能非常糟糕?尝试将其作为“/path/to/perl script args”而不是“script args”运行,看看是否有任何变化。