我要执行命令:
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,这不是要执行的命令的一部分。例如,我想传递一个字符串以显示命令是否失败。在wrapperFunction内部,我可以检查$?命令后,然后显示失败字符串,如果$? -ne0。如何还通过命令传递字符串?
最佳答案
不要混用代码和数据。分别传递参数(这是sudo
和find -exec
的作用):
wrapperFunction() {
COMMAND=( "$@" ) # This follows your example, but could
"${COMMAND[@]}" # also be written as simply "$@"
}
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 ! "$@" # if command fails
then
printf "%s: " "$error" # write error message
printf "%q " "$@" # 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
。由于引用方法并不重要,也不会传递给命令或函数,因此输出的引用可能与此处不同。它们在功能上仍然相同。