【问题标题】:condition always returns false条件总是返回 false
【发布时间】:2016-09-13 14:41:09
【问题描述】:

下面是我的预提交 git hook

#!/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 是一个符号链接

【问题讨论】:

  • 双引号 $FILE_PATH 再试一次...
  • @Jahid 不会改变结果,从我的终端尝试时我总是得到true
  • 您如何运行脚本以及与谁一起运行? git diff -U0 $FILE_PATH | grep -i 'todo' 在脚本中单独运行时会返回什么? git diff -U0 $FILE_PATH 怎么样?
  • @123 实际上非常有趣,当运行脚本bash my_script 时它可以工作。但是运行时不起作用git commit
  • $FILE_PATH 是绝对的吗?

标签: bash shell githooks


【解决方案1】:

很可能,您的管道不会返回状态 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 上,它似乎没有造成任何伤害。不过,为了安全起见,我还是会删除它。

【讨论】:

  • 总是给grep status is 1
  • 嗯,这意味着在git diff 的输出中没有找到单词todo。如果您认为不可能,请将 git 输出的副本定向到标准输出,例如:git diff -U0 "$FILE_PATH" | tee tmp$$; grep -iq todo tmp$$
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 2021-11-05
  • 2018-11-05
  • 2019-05-06
  • 2017-04-29
  • 2013-04-30
  • 2015-01-20
相关资源
最近更新 更多