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이 "오류" 대신 "최신" 또는 "변경됨"을 포함하는 줄을 표시하는 이유는 무엇입니까? ...그럼 이 단어에는 특별한 의미가 있는 걸까요? 이 경우 오류 메시지를 표시하려면 어떻게 해야 합니까?

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

관련 정보