2013-04-17 43 views
1

我試圖通過ksh腳本自動執行ClearCase簽入。有一個奇怪的問題,當它是自動化腳本的一部分時,下面的命令將不會運行,但如果將它粘貼到命令行中,則運行正常。ClearCase命令不會在腳本中運行

片段腳本:

for dir in `cat $DIRS` 
do 
    RUNCMD="cleartool find <<vob_directory>>/$dir -type f -exec 'cleartool co -nc \$CLEARCASE_PN'" 
    print $RUNCMD 
    $RUNCMD 
done 
exit 1 

產生以下命令

cleartool find <<vob_directory>> -type f -exec 'cleartool co -nc $CLEARCASE_PN' 

這裏的錯誤

cleartool: Error: Extra arguments: "co" 
Usage: find { pname ... [-depth | -nrecurse | -directory] 
     | [pname ...] -all [-visible | -nvisible] 
     | -avobs [-visible | -nvisible] 
     } 
     [-name 'pattern'] 
     [-cview] 
     [-user login-name] 
     [-group group-name] 
     [-type {f|d|l}...] 
     [-follow] 
     [-kind object-kind] 
     [-nxname] 
     [-element query] 
     [-branch query] 
     [-version query] 
     {-print | -exec command-invocation | -ok command-invocation} ... 

我在做什麼錯在這裏?

回答

2

儘管ksh(我的第一次測試是在bash),但您推薦的eval solution更常用(bash eval is a bit different)。

你可以在這個clearcase multisite script看到它。
如果你需要存儲的結果進行處理的變量,你可以按照this question

for dir in `cat $DIRS` 
do 
    RUNCMD="cleartool find <<vob_directory>>/$dir -type f -exec 'cleartool co -nc \$CLEARCASE_PN'" 
    print $RUNCMD 
    eval "res=\$($RUNCMD)" 
    print $res 
done 
exit 1 

原來的答覆:

您可能希望以防止外殼添加some quotes擴大您的命令太快,如在this example

RUNCMD="cleartool find <<vob_directory>>/$dir -type f -exec "'cleartool co -nc \$CLEARCASE_PN'"" 

甚至chaging si ngle報價由雙引號(如this thread

RUNCMD="cleartool find <<vob_directory>>/$dir -type f -exec "cleartool co -nc \"\$CLEARCASE_PN\"" 

(請注意,以考慮到路徑名,在他們的空間「\"」周圍\$CLEARCASE_PN

+0

我想你正在擴大(或*不*擴大)正確的命令。我嘗試了幾種「風格」的報價安排,但最終沒有真正起作用。感謝您藉此一系列的眼光。 – user1766760

+0

感謝您的鏈接 - 我將您的答覆標記爲答案,因爲它會更有用。我自己也不知道'ksh'和'bash'之間的區別。 – user1766760

1

我不能說爲什麼這是有效的,但一位同事告訴我關於eval。原來這個工作。

for dir in `cat $DIRS` 
do 
    RUNCMD="cleartool find <<vob_directory>>/$dir -type f -exec 'cleartool co -nc \$CLEARCASE_PN'" 
    print $RUNCMD 
    eval $RUNCMD 
done 
exit 1 
+0

優秀。 +1。我在我的問題中引用了它,並附加了其他ksh eval問題的參考。 – VonC