오류(stderr)를 필터링하기 위해 Bash에 별칭이나 함수를 작성하는 것이 가능합니까?

오류(stderr)를 필터링하기 위해 Bash에 별칭이나 함수를 작성하는 것이 가능합니까?

난 가끔 이런 걸 해

grep -ri foo .

그러나 일부 node_modules에는 존재하지 않는 장소에 대한 링크가 있을 수 있습니다. 그래서 나는

grep -ri foo . 2>&-

또는

grep -ri foo . 2> /dev/null

하지만 때로는 기억하기 어려울 때도 있습니다. 별칭을 작성하여

grep -ri foo . | discarderr 

작동할 수 있나요? stdout만 에 전달되기 때문에 이것이 어려울 수 있다고 생각합니다 . stderr과 stdout을 모두 전달 하고 오류를 삭제하는 discarderr방법이 없을 수도 있습니다 .discarderrdiscarderr

alias discarderr='cat 2> /dev/null'

이를 수행할 수 있는 방법이 있습니까? 아니면 함수를 통해 수행할 수도 있지만 그런 경우에는 조금 어색해 보일 수 있습니까 discarderr(grep -ri foo .)?

-sgrep에는 오류 메시지를 제거하는 기능이 있는 것 같습니다 . 하지만 다른 명령에 대한 일반적인 솔루션은 어떻습니까?

답변1

하나 이상의 인수로 주어진 명령을 실행하고 표준 오류 스트림을 삭제하는 쉘 함수:

discarderr () {
    "$@" 2>/dev/null
}

동일한 기능을 가진 별칭:

alias discarderr='2>/dev/null'

둘 다 같은 방식으로 사용됩니다.

discarderr some-command

2>/dev/null...장기적으로 이것은 명령을 혼란스럽게 할 수 있고 명령에 추가하는 것보다 더 번거로울 수 있습니다. 예를 들어, 사용하는 모든 시스템에서 별칭이나 함수를 인스턴스화해야 한다는 점을 기억해야 하며, 스크립트에서 함수를 사용하는 경우 코드를 검색하는 사람들로부터 진단 메시지가 삭제된다는 사실이 숨겨집니다.

또한 진단 메시지는 다음과 같습니다.효과가있다, 이상적으로는 이를 통해 데이터에 액세스하려고 하는 프로그램에서 오류를 유발한다는 사실을 해결하기보다는 죽은 심볼릭 링크와 같은 문제를 수정해야 합니다.

또한 를 사용하면 discarderr"이상한" 문제를 디버깅하기가 더 어려워질 수 있습니다. 예를 들어 명령이 실행되었는지 확인할 수 없습니다.별말씀을요예를 들어 discarderr grap( grep철자 오류)는 아무것도 출력하지 않습니다.

관련 정보