git 명령 출력 전에 줄을 추가하는 방법

git 명령 출력 전에 줄을 추가하는 방법

이것은 더 큰 스크립트의 일부이지만 문제를 다음과 같이 요약합니다.

cm_safe(){
   git push | while read line; do
    echo "cm safe push: $line"
   done;
}

다음과 같이 git 출력을 앞에 추가하고 싶습니다.

cm 보안 푸시: 모든 것이 최신 상태입니다.

하지만 나는 다음과 같은 결과를 얻습니다.

모든 것이 최신 상태입니다.

git은 tty에 직접 쓰나요, 아니면 다른 것인가요? 무슨 일이 일어났는지 모르겠어요.

답변1

git pushstderr에 기록하므로 파이프를 통해 전송하려면 stdout으로 리디렉션해야 합니다.

cm_safe(){
   git push 2>&1 | while IFS= read -r line; do
     echo "cm safe push: $line"
   done
}

아니면 이렇게 할 수도 있습니다:

git push |& while IFS= read -r line; do

나는 독서를 추천한다쉘의 제어 및 리디렉션 연산자는 무엇입니까?더 많은 정보를 알고 싶습니다.

답변2

지금까지 알고 있듯이 git pushs 출력은 stdout이 아닌 stderr로 전송됩니다. 그 외에는 또는 를 while IFS= read -r line제거해야 하는 특별한 이유가 없는 한 항상 셸을 사용하여 입력 줄을 읽어야 합니다 . 이는 항상 셸 변수를 인용하는 것과 같습니다. 필요할 때 제거하는 것이지 필요할 때 추가하는 것이 아닙니다.IFS=-r

FWIW 나는 다음을 사용할 것입니다 :

cm_safe() { git push 2>&1 | awk '{print "cm safe push:", $0}'; }

또는:

cm_safe() { git push 2>&1 | sed 's/^/cm safe push: /'; }

아무튼 그걸 감안하면쉘 루프를 사용하여 텍스트를 처리하는 것은 나쁜 습관으로 간주됩니다..

답변3

이것이 작동하는 것 같지만 이유는 모르겠습니다.

 git push &> /dev/stdout

git이 stdout/stderr을 터미널 stdout으로 보내도록 강제합니까? 난 이해가 안 돼요

관련 정보