표준 오류에 쓰기

표준 오류에 쓰기

나는 그것을 사용하고 있다스트라이디드stderr 빨간색으로 흐르는 모든 출력을 색상화합니다. 잘 달리고 있어요. 그러나 내 자신의 bash 스크립트를 작성하고 오류가 발생하면 echo 'error' 1>&2출력이 빨간색으로 표시되지 않습니다. 이는 명령이 단순히 출력을 stderr 파일 설명자가 가리키는 위치로 리디렉션하지만 메시지를 stderr에 속하는 것으로 제대로 표시하지 않기 때문이라고 생각합니다. 그렇습니까? Bash에서 stderr에 올바르게 쓰는 방법은 무엇입니까?

답변1

프로그램은 파일 설명자 2에 인쇄하고 있는지 여부를 감지하기 위해 다양한 write() 함수를 재정의한 다음 관련 이스케이프 코드를 추가하여 터미널 출력을 빨간색으로 만드는 것으로 보입니다.

불행하게도 셸에서 다음과 같은 작업을 수행하면

echo "foo" 1>&2 

함수는 여전히 파일 설명자 1에 대해 쓰기(또는 기타 유사한 시스템 호출)를 호출합니다. 파일 설명자 1이 셸에 의해 파일 설명자 2로 복사되었기 때문에 출력은 fd 2에 나타납니다.

불행히도 쉘에서 fd 2에 /directly/를 쓰는 방법을 모르지만 awk를 사용할 수 있습니다. 이와 같은 함수는 인수를 파일 설명자 2에 직접 씁니다.

error() {
  awk " BEGIN { print \"$@\" > \"/dev/fd/2\" }"
}

나는 이것이 POSIX의 일부가 아닌 GNU awk의 기능이라고 생각합니다. 그러나 OS X에서도 사용할 수 있는 awk에서도 작동합니다.

답변2

소프트웨어 후크 write()는 파일 설명자 2( stderr.

공유 라이브러리이므로 커널을 다시 컴파일할 필요가 없습니다. 설치 매뉴얼에 명시된 대로 환경 변수를 사용합니다 LD_PRELOAD. 동적 링커는 프로그램 실행 중에 동작을 수정할 수 있습니다. 이러한 변수는 대체 위치에서 공유 라이브러리를 검색하여 런타임 연결 프로세스를 조정합니다.

실행 파일 /bin/bash자체는 이러한 변수를 지원하지 않으므로 bash수정된 팔레트가 아닌 시스템 호출의 원래 팔레트를 사용합니다. 귀하 의 질문에서 언급한 리디렉션은 bash. bash를 통하지 않고 오류 설명자를 직접 작성할 수 있다면 출력은 빨간색이 됩니다 echo.echo

Python은 을 쓸 수 있습니다 stderr. 증명을 참조하세요(빨간색으로 표시되어야 함):

python -c 'import os; os.write(2, "error")'

답변3

도우미 함수를 만듭니다.

echoerr() { printf "\033[0;31m%s\n\033[0m" "$*" >&2; }

어디서나 사용할 수 있습니다.

echoerr "something went wrong here"

이는 stderr( >&2)에 쓰기와 색상 변경을 결합합니다(여기에서 가져온 솔루션).https://stackoverflow.com/questions/5947742/how-to-change-the-output-color-of-echo-in-linux).

답변4

지시에 따라https://github.com/sickill/stderred스크립트에 추가해야 합니다.

export LD_PRELOAD="/path/to/stderred/\$LIB/libstderred.so${LD_PRELOAD:+:$LD_PRELOAD}"

$LIB아키텍처에서 수동으로 교체해야 할 수도 있습니다 .

관련 정보