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)')"

リポジトリに空白行があるローカルファイルの1つの変更によってエラーが発生するまで、うまくいきました。

端子出力は次のとおりです。

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が「エラー」の代わりに「最新」または「変更済み」を含む行を表示するのはなぜですか? ...では、この単語には特別な意味があるのでしょうか?この場合、エラーメッセージを表示するにはどうすればよいですか?

答え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)')"

関連情報