在husky的pre-commit钩子中使用Bash数组出现语法错误
husky pre-commit钩子数组初始化报错原因排查
我在husky的pre-commit钩子中实现了选择语义版本(Patch、Minor、Major)的交互功能,但初始化数组时触发错误:
.husky/pre-commit: 20: Syntax error: "(" unexpected husky - pre-commit hook exited with code 2 (error)
错误行对应数组初始化代码selectOptions=("Patch" "Minor" "Major")。
钩子脚本代码如下:
#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" . "$(dirname -- "$0")/config.cfg" scriptsDir=$(echo "$(pwd)/scripts"); . "$scriptsDir/select.sh" echo "\nSemantic version: ${darkGray}(use arrow keys)${noColor}" echo selectOptions=("Patch" "Minor" "Major") select_option "${selectOptions[@]}" choice=$? echo "Choosen index = $choice" echo " value = ${selectOptions[$choice]}"
其中select_option函数可生成通过上下箭头和回车键选择的文本选项列表,返回选中项索引,该函数已在测试脚本中验证正常运行。
问题原因
- 解释器不支持数组语法:脚本开头指定的
#!/usr/bin/env sh调用的是POSIX标准的Shell(如部分系统默认的dash),这类Shell不支持selectOptions=("Patch" "Minor" "Major")这种Bash专属的数组初始化语法,执行时会将括号识别为非法语法。 - 函数依赖的特性不兼容:
select_option函数是在Bash环境下测试通过的,它大概率依赖了Bash的特性(如数组操作、特定内置命令),即使数组初始化问题临时绕过,用sh执行仍会触发其他错误。
解决办法
- 修改脚本解释器:将脚本开头的
#!/usr/bin/env sh改为#!/usr/bin/env bash,强制用Bash执行钩子脚本,即可支持数组及其他Bash专属特性。 - 确认依赖脚本兼容性:保证
select.sh中的函数实现完全兼容Bash(由于你已测试该函数正常,此步骤通常无需额外调整)。
内容的提问来源于stack exchange,提问作者SaboSuke
相关产品推荐
相关产品推荐

