条件总是 returns 错误

condition always returns false

下面是我的预提交git hoook

#!/bin/bash

....
# if git diff -U0 "$FILE_PATH" | grep -iq 'todo'; # Double quoting $FILE_PATH doesnt' change anything
if git diff -U0 $FILE_PATH | grep -iq 'todo';
then
    echo $FILE_PATH ' -> Contains TODO'
    exit 1

else
    echo 'nooooooooooooooooooooooooooooooooooo'
fi

我总是收到 noooooooooooooooooooo 消息,但是下面的命令直接在我的终端上尝试运行良好:

git diff -U0 my/file/path.php | grep -iq 'todo' && echo 'true' || echo 'false'

输出

true

更新

当运行bash .git/hooks/pre-commit有效时,很奇怪!!

仅供参考

我不知道这是否是重要信息,但是 .git/hooks/pre-commit 是一个符号 link

很可能,您的管道没有 return 状态 0。要验证情况是否如此(而不是您编写复合语句的方式),您可以将其重写为

git diff -U0 "$FILE_PATH" | grep -iq 'todo'
grep_status=$?
echo grep status is $grep_status
if (( grep_status == 0 ))
then
  echo contains todo
else
  echo no
fi

我还注意到您的代码在 if 行中包含一个不必要的分号。我首先认为这个分号可能会导致奇怪的行为,但至少在我的 bash 上,我尝试了你的代码,它似乎没有造成任何伤害。尽管如此,为了安全起见,我还是会删除它。