这是通过 macOS 14 (Sonoma) 的命令行完成的。
有人可以解释为什么以下函数中的参数似乎没有被正确处理吗?
首先,请注意以下工作正常(直接从命令 lilne 调用),所以这不是钥匙串问题:
# [1] succeeds
codesign -f -vvvv --strict --deep --timestamp -s "Developer ID Application: My Company Inc. (123456)" --options runtime "/MyFolder/MyFile.dylib"
如果我在函数中硬编码“-s”参数,我也可以从函数中调用它:
# [2] succeeds
function myFunc()
{ codesign ${1} -s "Developer ID Application: My Company Inc. (123456)" ${2}
}
myFunc "-f -vvvv --strict --verbose --deep --timestamp --options runtime" "/MyFolder/MyFile.dylib"
但是,如果我包含“-s”参数作为参数,则会收到错误“开发人员:未找到身份”:
#[3] error: "Developer: no identity found
function myFunc()
{ codesign ${1} ${2}
echo {1} = "${1}"
}
myFunc "-f -vvvv --strict --verbose --deep --timestamp -s \"Developer ID Application: My Company Inc. (123456)\" --options runtime" "/MyFolder/MyFile.dylib"
这不是钥匙串问题,因为
codesign
适用于案例 [1] 和 [2]。
结果
echo
表示参数好像传递OK了:
{1} = -f -vvvv --strict --verbose --deep --timestamp -s "Developer ID Application: My Company Inc. (123456)" --options runtime
我尝试过反引号、转义空白,但都行不通。
有什么想法吗?顺便说一句,我需要这个,因为有很多文件需要签名和验证,我正在努力减少重复。
尝试在 Bash 中将多个参数放入一个字符串中通常不是一个好主意。有时,使其发挥作用的唯一方法是使用
eval
,但这通常只会给您带来更多问题(其中一些可能非常不明显)。请参阅 为什么在 Bash 中应该避免 eval,我应该使用什么来代替?.
在这种情况下,我可以通过定义如下函数来避免问题:
function myFunc
{
codesign "${@:2}" "$1"
}
并这样称呼它:
myFunc "/MyFolder/MyFile.dylib" -f -vvvv --strict --deep --timestamp -s "Developer ID Application: My Company Inc. (123456)" --options runtime
即将要签名的文件的路径作为第一个参数,并将
codesign
的参数设置为以下所有单独的参数。任何与 codesign
本身一起使用的参数在作为参数(2 及以下)提供给 myFunc
时都保证有效。