GitHub Actions中Shell命令报错:sh: 1: !: not found
问题原因与修复方案
问题根源
GitHub Actions的Ubuntu运行环境中,/bin/sh指向的是dash(轻量POSIX标准shell),而非你本地环境可能使用的bash。dash不支持在逻辑表达式中直接使用!作为否定运算符(这属于bash的扩展语法),因此当第一个条件判断为false时,执行到! git diff就会触发! not found的报错。
修复方案
方案一:指定用bash执行步骤(推荐)
直接在步骤中声明使用bash执行,无需修改原有命令逻辑,就能兼容你原本的写法:
- name: Check version is up to date shell: bash run: | (git diff --quiet HEAD^ VERSION && git diff --quiet HEAD^ src/**) || \ ! git diff --quiet HEAD^ src/VERSION
方案二:兼容dash的写法
如果需要保持用sh执行,将!替换为基于退出码的判断逻辑,避免依赖bash扩展语法:
- name: Check version is up to date run: sh -c " if ! (git diff --quiet HEAD^ VERSION && git diff --quiet HEAD^ src/**); then git diff --quiet HEAD^ src/VERSION exit \$((1 - \$?)) fi "
这里通过exit $((1 - $?))实现和! git diff --quiet完全一致的逻辑:若git diff --quiet返回0(无差异),则退出码设为1(步骤失败);若返回1(有差异),则退出码设为0(步骤成功)。
内容的提问来源于stack exchange,提问作者joel
相关产品推荐
相关产品推荐

