如何仅在另一命令有输出时执行bash命令?
正确实现Git缓存差异检查与提交的Bash命令
你遇到的问题核心在于git diff的退出码逻辑和预期相反:
- 当目标路径没有差异时,
git diff HEAD ./path/to/cache返回退出码0(bash判定为"成功"),所以&&会触发后面的git add,这不符合需求; - 当目标路径存在差异时,
git diff返回退出码1(bash判定为"失败"),此时&&不会执行后续命令,完全和需求反向。
方案一:简洁写法(用--quiet配合||)
最简洁的实现是利用git diff --quiet(仅返回退出码,不输出差异内容),结合||(当前面命令失败时执行后续命令):
git diff --quiet HEAD -- ./path/to/cache || git add ./path/to/cache
这里的--是为了避免路径名被Git误判为分支或标签,提升命令鲁棒性。当路径存在差异时,git diff --quiet返回1,||会触发git add;无差异时返回0,跳过git add。
方案二:显式逻辑分支(用if语句)
如果需要更清晰的逻辑分支(比如出错时做额外处理),可以用if语句:
if ! git diff --quiet HEAD -- ./path/to/cache; then # 仅当存在差异时执行add git add ./path/to/cache fi
!符号会反转命令的退出码判断,当git diff --quiet返回1(有差异)时,!将其转为"真",进入分支执行git add。
内容的提问来源于stack exchange,提问作者Rafid Muhymin Wafi
相关产品推荐
相关产品推荐

