여기서 ERR 트랩이 호출되는 이유는 무엇입니까?

여기서 ERR 트랩이 호출되는 이유는 무엇입니까?

stderr명령의 출력에 색상을 지정 하는 다음 기능이 있습니다 .

red=`tput setaf 1`

colorerr() {
  (trap 'tput sgr0' EXIT; eval "$* 2> >(echo -n \"${red}\"; cat -;)")
}

예를 들어:

colorerr "bash -c 'cd ${WEB_APP_DIR}; npm run-script build'"

스크립트는 set -e, trap ... ERR및 를 사용하여 trap ... EXIT실패 시 줄 번호와 스택 추적을 보고합니다. 전달된 명령 문자열이 colorerr실패하는 경우를 제외하면 모든 것이 잘 작동하며 오류를 포착하여 더 나은 보고서를 제공하고 싶습니다(함수 내에서 오류가 발생했다고 알려주는 것은 colorerr소용이 없기 때문입니다).

표준 || ...구성을 시도했지만 하위 쉘 내에서 오류가 colorerr여전히 발생했습니다 ERR trap. 테스트로 다음을 시도했습니다.

(trap 'tput sgr0' EXIT; eval "$* 2> >(echo -n \"${red}\"; cat -;)") ||
 true

그러나 ERR 트랩은 여전히 ​​​​트리거됩니다. || true평소와 같이 오류 코드가 "0"으로 설정되지 않는 이유는 무엇입니까 ?

답변1

실제로 답변은 아니지만 해결 방법입니다. 이 시도:

col-err() { "$@" 2> >(grep --color .) ; }

colorerr구문은 질문의 함수 와 약간 다릅니다 . ~ 을 위해 col-err, ~을 위해아니요실행할 명령을 인용하면 다음과 같습니다.

col-err bash -c 'cd ${WEB_APP_DIR}; npm run-script build'

어디서나 실행할 수 있는 예:

col-err bash -c 'ls    $SHELL ${SHELL}_no_such ; echo
                 ls -l $HOME   ${HOME}_no_such | head -2'

col-err호출 로 인해 grep변수와 함께 사용됩니다 $GREP_COLORS. 색상을 녹색( ms=01;32아래 첫 번째 색상)으로 한 번만 변경합니다.

GREP_COLORS='ms=01;32:mc=01;33:sl=:cx=:fn=35:ln=32:bn=32:se=36' \
col-err bash -c 'ls    $SHELL ${SHELL}_no_such ; echo
                 ls -l $HOME   ${HOME}_no_such | head -2'

참고: 색상 문자열은 다음에서 조정되었습니다.크리키스답변"다른 grep마다 다른 색상을 사용하십시오".

관련 정보