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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:15:02