【问题标题】:How do I make if statement recognize grep as true or false?如何使 if 语句将 grep 识别为真或假?
【发布时间】:2021-04-11 08:35:39
【问题描述】:

我目前正在尝试编写一个快速的 bash 脚本来更新文件夹中的所有项目。我正在尝试这样做:

badCount=0
projectCount=0
manual_projects[badCount]="leave_empty"
badCount=$((badCount+1))

for project in */
do
    echo ''
    projectCount=$((projectCount+1))
    cd "$project"
    echo "$project"
    git fetch
    git checkout build | grep awudgawu
    if (git pull | grep -qw error); then
        manual_projects[$badCount]=$project
        badCount=$((badCount+1))
    fi
    cd ../
done

由于某种原因,它永远不会进入 if 条件,即使有些项目从它们输出了错误。为什么我的条件总是导致错误?如果在拉取请求中有“错误”这个词,我怎样才能让它返回 true?

【问题讨论】:

  • 使用 bash -x 调试脚本。

标签: bash git grep


【解决方案1】:

首先

您遇到的问题来自 | grep 序列仅查看标准输出 (stdout),而错误消息来自标准错误 (stderr)。

玩具示例(不要尝试,因为有 git rm… !):

$ git rm '*'

$ git pull | grep Please
→ "doesn't work"

$ git pull 2>&1 | grep Please
→ Please commit your changes or stash them before you merge.

下一步

问题是,你确定要依赖grep吗?

因为尝试通过对 git 命令的结果执行 grep 来检测错误似乎是一项棘手的工作。实际上,不能保证 error 词本身会成为错误消息的一部分。

(此外,还有一个与管道退出状态相关的微妙之处,例如false | true ; echo $?

其实所谓的退出状态(也就是错误码)可以直接使用($?),也可以借助if-then-else

例子:

$ false
$ echo $?
→ 1
$ true
$ echo $?
→ 0

$ if false; then echo ok; else echo ko; fi
→ ko

$ if git pull non-existing-remote; then
  echo ok
else
  echo ko
fi

相关工具

您尝试创建的脚本让我想到了 Joey Hess 开发的以下工具:http://myrepos.branchable.com(另请参阅this description

免责声明:我本人不是myrepos 用户,但我想您可能有兴趣尝试它,因为它专门设计用于管理存储在给定文件夹中的许多存储库……

【讨论】:

  • 您的链接看起来像我们正在尝试做的事情,是的,非常好的资源谢谢。不标记为答案,因为我的重点是如果我可以拉,并得到一个错误,例如“你需要先提交你的更改”,我如何用 grep 解释它? (或任何其他方式)
  • @NathanielCutajar 好的(所以我相应地扩展了我的答案:)
  • 干得好,解释得很详细。正如您所指出的,执行if(git pull) 会导致它检查输出是否良好。添加! 使其在失败时进入 if 语句。非常感谢!
  • @NathanielCutajar 不要使用括号。 if (git pull)if git pull 慢,因为它产生了一个额外的子shell;这也意味着如果你调用类似 shell 函数的东西,它会被阻止在父 shell 中设置变量、更改其工作目录等。
  • @NathanielCutajar,当然;有时您想要将shell函数隔离到可以更改自己的目录或覆盖文件描述符而不影响父进程的位置。我也看到人们有时试图使用它们进行分组,但总的来说花括号在这种情况下更有意义; if { git pull; }; then 让您在不强制使用额外子外壳的情况下获得视觉清晰度。
猜你喜欢
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多