Grep 忽略了我的部分模式?

Grep 忽略了我的部分模式?

我有一个很好的bash/zenity脚本,用于检查/更新多个 git 存储库并报告每个存储库的状态,如下所示 - 这里仅显示一个示例存储库:

zenity --class=CheckGit --info title="Check git updates" --text="\n \
<b>MY-GIT-REPO:</b> $(cd "/home/ME/.local/share/git/MY-GIT-REPO" && git pull | grep -E '(up-to-date|changed)')"

它运行良好,直到我由于本地文件之一的更改而遇到错误,导致该存储库出现空行。

终端输出如下:

error: Your local changes to the following files would be overwritten by merge:
    xxx/yyy
Please, commit your changes or stash them before you can merge.
Aborting

所以我修改了 grep 命令,如下所示:grep -E '(up-to-date|changed|error)'也显示此类消息。但令我惊讶的是它仍然拒绝显示任何内容。

作为 bash 脚本编写的新手,我不明白是什么原因造成的。为什么 grep 显示包含“up-to-date”或“changed”而不是“error”的行?...那么这个词有特殊含义吗?在这种情况下,我怎样才能让它显示错误消息呢?

答案1

Git 将其错误写入 stderr,因此如果您重定向正常输出(到文件,或者在您的情况下将其通过管道传输到程序中),您就不会错过它们。

你可以试试:

zenity --class=CheckGit --info title="Check git updates" --text="\n \
<b>MY-GIT-REPO:</b> $(cd "/home/ME/.local/share/git/MY-GIT-REPO" && git pull 2>&1 | grep -E '(up-to-date|changed|error)')"

相关内容