2014-02-20 274 views
0

我要執行的命令:時只需在終端執行猛砸單引號

xcodebuild -exportArchive -exportFormat IPA -archivePath myApp.xcarchive -exportPath myApp.ipa -exportProvisioningProfile 'myApp adhoc' 

上面的命令工作正常。但是,我試圖在bash中的包裝函數中執行命令。包裝函數通過傳遞一個命令並基本執行該命令來工作。例如,在wrapperFunction打電話:

wrapperFunction "xcodebuild -exportArchive -exportFormat IPA -archivePath myApp.xcarchive -exportPath myApp.ipa -exportProvisioningProfile 'myApp adhoc'" 

和wrapperFunction本身:

wrapperFunction() { 
    COMMAND="$1" 
    $COMMAND 
} 

的問題是在'myApp adhoc'單引號,因爲通過wrapperFunction運行命令時出現錯誤:error: no provisioning profile matches ''myApp' 。它不是拿起供應配置文件的全名'myApp adhoc'

編輯:這麼說,我也想通過一個可替換的wrapperFunction,這不是要執行的命令的一部分。例如,如果命令失敗,我想傳遞一個字符串來顯示。內部包裝函數我可以檢查$?在命令之後再顯示失敗字符串if $? -ne 0.我怎樣才能傳遞一個字符串與命令?

回答

3

請勿混淆代碼和數據。分別傳遞參數(這就是sudofind -exec一樣):

wrapperFunction() { 
    COMMAND=("[email protected]") # This follows your example, but could 
    "${COMMAND[@]}" # also be written as simply "[email protected]" 
} 

wrapperFunction xcodebuild -exportArchive -exportFormat IPA -archivePath myApp.xcarchive -exportPath myApp.ipa -exportProvisioningProfile 'myApp adhoc' 

要提供自定義錯誤消息:

wrapperFunction() { 
    error="$1" # get the first argument 
    shift  # then remove it and move the others down 
    if ! "[email protected]" # if command fails 
    then 
     printf "%s: " "$error" # write error message 
     printf "%q " "[email protected]"  # write command, copy-pastable 
     printf "\n"    # line feed 
    fi 
} 
wrapperFunction "Failed to frub the foo" frubber --foo="bar baz" 

這將產生該消息Failed to frub the foo: frubber --foo=bar\ baz

由於引用的方法並不重要,並且不會傳遞給命令或函數,所以輸出可能與此處的引用方式不同。它們仍然功能相同。

+0

完美地工作。非常感謝。仔細闡述它是如何工作的? –

+1

FWIW,第一個例子可以更簡單地寫成'wrapperFunction(){「$ @」; }'。推測將參數放入數組的原因是在調用封裝函數之前允許進行某種操作或檢查;這可能值得更加明確。另外,注意在這種包裝器中注入可執行文件,特別是如果它們在不安全的環境中運行。 'eval'不是唯一的安全漏洞,儘管它可能是最糟糕的。 – rici

+0

您傳入多個參數,然後使用這些參數執行程序。這與試圖將多個參數放入一個字符串中相反,將它們解釋爲shell代碼而不是參數,希望能夠完整地取回參數。如果你熟悉C,它基本上是'int main(..,char * argv){execve(argv [0],argv,..); }而不是'system(argv [1])'。 –