스크립트에서 오류는 일반적으로 다음과 같이 파일 디스크립터 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
.
더 읽을 거리 :
- “> / dev / stdout”의 이식성
- bash 스크립트에서 ‘printf’를 사용하여 ‘stderr’에 오류 메시지를 작성하려면 어떤 방법을 사용해야합니까?
- 패치 / awk-dev-stderr (autoconf-patches)
- Bash 스크립트에서 stderr 및 stdout 리디렉션
- 20 장. I / O 리디렉션 (고급 Bash 스크립팅 안내서)
답변
bash는, 다른 쉘에서, 리디렉션 뭔가 방법 에 대한 표준 오차는 사용하는 것입니다 >&2
. Bash가 파일 디스크립터/dev/stderr
로 열립니다 . 파일 기술자가 참조하는 경우 기술자의 수입니다. 따라서 에 표준 오류로 인쇄 합니다 . 2
&N
N
echo error >&2
error
/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을 사용하면 불필요한 경고가 발생합니다).