출력을 / dev / stderr vs.> & 2로 보내기 오류는 일반적으로 다음과 같이 파일

스크립트에서 오류는 일반적으로 다음과 같이 파일 디스크립터 2로 전송됩니다 &2.

echo "error" >&2

때때로 /dev/stderr대신에 사용됩니다 :

echo "error" > /dev/stderr

를 살펴보면 /dev/stderr이 링크가에 대한 심볼릭 링크 /proc/self/fd/2인 것으로 나타났습니다.이 링크는 /dev/pts/5현재 터미널에서 심볼릭 링크 입니다.

조금 복잡해 보입니다. 그 뒤에 어떤 논리가 있습니까?

사용 /dev/stderr하고 &2있습니까?

다른 것보다 선호되는 것이 있습니까?



답변

특수 장치 /dev/stderr는 시스템마다 다르며 파일 디스크립터 2(특수 장치 /proc/self/fd/2아님)는 이식 가능합니다. 이식 불가능한 코드를 작성하려면 이러한 특수 장치를 시작하는 것이 좋습니다.

/dev/stderr리눅스, OSX 와 같은 몇 가지 시스템이 있습니다 . 그러나 OSX에는 /proc파일 시스템 이 없으며 /dev/stderr로 연결됩니다 /dev/fd/2.

더 읽을 거리 :


답변

bash는, 다른 쉘에서, 리디렉션 뭔가 방법 에 대한 표준 오차는 사용하는 것입니다 >&2. Bash가 파일 디스크립터/dev/stderr 로 열립니다 . 파일 기술자가 참조하는 경우 기술자의 수입니다. 따라서 에 표준 오류로 인쇄 합니다 . 2&NNecho error >&2error/dev/stderr

/dev/stdout파일 디스크립터로 도 열립니다 1. 이것은 당신이 할 수 있다는 것을 의미합니다 echo output >&1. 그러나 기본적으로 모든 것이 표준 출력으로 인쇄되므로 echo output그 자체 와 동일 합니다.

이제는 2>다릅니다. 여기서는 명령의 오류 출력을 다른 곳으로 리디렉션합니다. 따라서 2>file“파일 설명자 2 (표준 오류)로 인쇄 된 모든 것을”으로 리디렉션 file합니다. “


답변

당신 말이 맞아, >&2더 직접적이고 완벽 “관용적”입니다. 그것들은 동등해야하므로 사용할 특별한 이유가 없습니다 >/dev/stderr. 그것을 제외하고, 누군가 읽는 것이 이것이 무엇을하는지 모른다면, 그들 중 하나는 다른 것보다 찾기가 더 쉽습니다. :-). 그러나 일반적으로을 사용하는 것이 좋습니다 >&2.

/ dev / stderr는 프로그램이 지정된 파일 이름에 오류를 쓰지만 stderr을 지원하지 않을 때 유용 할 수 있습니다. 분명히 이것은 약간 고안되었습니다. / dev / stdout이 훨씬 더 유용합니다. (최근 mysql_safe래퍼 스크립트가 콘솔에 오류를 쓰지 않는다는 것을 알았습니다 . 불행히도 오류 로그 파일에 대한 권한을 변경하고 싶기 때문에 / dev / stderr을 사용하면 불필요한 경고가 발생합니다).


답변