Bash 函数参数难题

问题描述 投票:0回答:1

这是通过 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 macos command-line
1个回答
0
投票

尝试在 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
时都保证有效。

© www.soinside.com 2019 - 2024. All rights reserved.