我觉得我错过了一些非常明显的东西,但我似乎无法弄清楚发生了什么。我有一个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应用程序运行,因此不需要 。
答案 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
”运行,看看是否有任何变化。