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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 10:45:08