You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS 14 Sonoma下ZSH函数codesign参数传递异常求助

macOS Sonoma下codesign函数参数传递异常解析

问题场景

在macOS 14(Sonoma)的ZSH命令行环境中,执行codesign签名操作时出现如下参数传递异常:

  1. 直接执行codesign命令,签名成功:
# [1] succeeds
codesign -f -vvvv --strict --deep --timestamp -s "Developer ID Application: My Company Inc. (123456)" --options runtime "/MyFolder/MyFile.dylib"
  1. 在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"
  1. 将包含-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 16:23:15