2009-08-12 66 views
3

我覺得我錯過了一些很明顯的東西,但我似乎無法弄清楚發生了什麼。我有一個我從C代碼調用的perl腳本。該腳本+論據是這樣的:帶有空格的命令行參數的Perl腳本

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

當我在Windows中運行它,Perl的正確識別爲5個參數,而當我跑了它在SunOS UNIX系統,它識別8,分裂ARG與將空格分隔成單獨的參數。

不知道這有什麼差別,但是在Windows,我運行它想:

perl my_script <args> 

雖然在Unix中我只是運行它像上面顯示的可執行文件。

任何想法爲什麼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應用程序運行,所以沒有什麼更復雜的應該要求。

+3

請提供您在Unix中使用您的C代碼調用perl腳本的確切代碼。 – Steven 2009-08-12 18:26:59

+1

請提供關於如何加載參數字符串的更多細節。我相信你的問題在於這個代碼。 – Steven 2009-08-12 18:57:50

+0

我相當確信它不是......我把一些調試代碼放在那個會調用系統之前輸出該cmd,它完全是我最初發布的。 – Morinar 2009-08-12 18:59:08

回答

3

想必

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

引起的一切通過的bash去(因爲需要解釋家當行,吃起來你傳遞引號)。再次,大概可以通過直接調用perl而不是依靠shell來找到它(儘管如果路徑上的perl不同於shebang線上提供的那個,這可能是個問題)可以避免該問題。

更新:

鑑於你:

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

,你可能會想嘗試:

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

另一個更新:

感謝您接受我的回答,但是,我的整個理論可能是錯誤的。

我試過的argument雙backwhacked版本以上GNU bash, version 4.0.28(2)-release (i686-pc-linux-gnu)和它結束了傳遞

 
[[email protected] src]$ ./t 
'"arg1"' 
'"arg2"' 
'"arg3' 
'with' 
'spaces"' 
'"arg4"' 
'"arg5"' 

而原始argument工作就像一個魅力。我對此有點困惑。也許SUN的shell不是bash,或者可能還有別的事情發生。

+0

好吧,這似乎是問題所在。當我更新Unix cmd以實際調用perl時,它完全符合我的預期。我仍然不確定它爲什麼不起作用,尤其是考慮到Juliano試圖複製。好吧。至少它有效。 – Morinar 2009-08-12 19:01:30

1

您忘記了SunOS的報價嗎?

如果你

perl script arg1 arg2 "arg3 with spaces" arg4 arg5 

你應該不錯。否則,請嘗試切換外殼。

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外殼解釋引用參數 作爲一個參數。你可以做一個 快速測試:

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

的結果是,你指望它什麼 是:「C d E」被視爲一個單一的 說法。

我覺得你的 腳本有問題,在處理 邏輯的參數中。

0

SunOS內核對shebang解釋器的處理有可能是非常糟糕的嗎?嘗試運行它作爲「/path/to/perl script args」而不是「script args」,看看是否有任何改變。

相關問題