macOS 14 Sonoma下ZSH函数codesign参数传递异常求助
macOS Sonoma下codesign函数参数传递异常解析
问题场景
在macOS 14(Sonoma)的ZSH命令行环境中,执行codesign签名操作时出现如下参数传递异常:
- 直接执行codesign命令,签名成功:
# [1] succeeds codesign -f -vvvv --strict --deep --timestamp -s "Developer ID Application: My Company Inc. (123456)" --options runtime "/MyFolder/MyFile.dylib"
- 在ZSH函数中硬编码
-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参数的完整配置作为单个函数参数传入时,抛出错误**"Developer: no identity found"**:
#[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"
echo输出显示参数内容看似正常,但尝试多种转义、引号处理方式均无效,因需批量签名文件减少重复代码,需排查该异常原因。
问题核心原因
问题出在ZSH对字符串参数的拆分逻辑上:
- 当你把包含
-s "xxx"的整串作为单个参数传入函数后,用${1}展开时,ZSH只会按空格拆分内容,不会解析你手动添加的转义引号。 - 原本的
-s "Developer ID Application: My Company Inc. (123456)"会被拆分成多个独立参数:-s、"Developer、ID、Application:、My、Company、Inc.、(123456)"。 - 此时codesign会把
"Developer"当作签名身份的名称,自然找不到对应的开发者身份,因此抛出"Developer: no identity found"错误。
可行解决方案
方案1:使用数组传递参数(推荐)
ZSH的数组可以正确保留带空格的参数结构,避免拆分错误:
function myFunc() { codesign "$@" } # 用数组定义所有codesign参数,自动保留空格分隔的完整参数 local codesign_args=( -f -vvvv --strict --verbose --deep --timestamp -s "Developer ID Application: My Company Inc. (123456)" --options runtime "/MyFolder/MyFile.dylib" ) # 传递数组参数,确保每个参数被正确解析 myFunc "${codesign_args[@]}"
方案2:拆分参数为多个独立项传递
将不同类型的参数拆分为多个函数参数,避免整串传递的歧义:
function myFunc() { local base_flags="${1}" local sign_identity="${2}" local target_file="${3}" codesign ${base_flags} -s "${sign_identity}" --options runtime "${target_file}" } # 分参数传入,明确每个部分的边界 myFunc "-f -vvvv --strict --verbose --deep --timestamp" "Developer ID Application: My Company Inc. (123456)" "/MyFolder/MyFile.dylib"
方案3:使用eval解析参数(不推荐)
如果必须用字符串传递参数,可以用eval强制解析引号,但该方式存在安全风险(若参数包含恶意内容会执行危险命令):
function myFunc() { eval codesign ${1} ${2} } myFunc "-f -vvvv --strict --verbose --deep --timestamp -s \"Developer ID Application: My Company Inc. (123456)\" --options runtime" "/MyFolder/MyFile.dylib"
内容的提问来源于stack exchange,提问作者Pierre
相关产品推荐
相关产品推荐

