스크립트에서 오류는 일반적으로 파일 설명자 2로 전송됩니다 &2
. 즉, 다음과 같습니다.
echo "error" >&2
때로는 /dev/stderr
다음과 같이 사용되기도 합니다:
echo "error" > /dev/stderr
를 보면 /dev/stderr
의 심볼릭 링크일 뿐이지만 (현재 터미널에서는) /proc/self/fd/2
의 심볼릭 링크인 것을 알 수 있습니다./dev/pts/5
좀 너무 복잡한 것 같습니다. 이것 뒤에 어떤 논리가 있습니까?
using /dev/stderr
과 &2
동등한가요?
둘 중 하나가 다른 것보다 더 선호됩니까?
답변1
특수 장치 /dev/stderr
는 시스템마다 다르지만 파일 설명자 2
(특수 장치가 아님 /proc/self/fd/2
)는 이식 가능합니다. 이식 불가능한 코드를 작성하려면 이러한 특수 장치를 사용하는 것이 좋습니다.
다음과 같은 시스템이 제공됩니다 /dev/stderr
. 물론 Linux도 포함됩니다.OSX. 하지만 OSX에는 /proc
파일 시스템 /dev/stderr
이 없습니다 /dev/fd/2
.
추가 자료:
답변2
Bash 및 기타 쉘에서 무언가를 리디렉션하는 방법도착하다Bash를 사용하여 표준 오류 가 >&2
열립니다./dev/stderr
파일 설명자 2
. 파일 설명자는 설명자 번호로 &N
참조됩니다 . N
따라서 표준 오류로 echo error >&2
인쇄합니다 .error
/dev/stderr
또한 /dev/stdout
파일 설명자로 열립니다 1
. 이것은 당신이 그것을 할 수 있다는 것을 의미합니다 echo output >&1
. 그러나 기본적으로 모든 것이 표준 출력으로 인쇄되므로 그 echo output
자체는 동일합니다.
이제는 2>
다릅니다. 여기에서는 명령의 오류 출력을 다른 곳으로 리디렉션합니다. 즉, 2>file
"파일 설명자 2(표준 오류)에 인쇄된 모든 항목을 file
"로 리디렉션합니다." 를 의미합니다.
답변3
당신 말이 맞습니다. >&2
더 직접적이고 "관용적"입니다. 그것들은 동일해야 하므로 사용할 특별한 이유가 없습니다 >/dev/stderr
. 그 외에는 읽는 사람이 자신이 하는 일을 모르는 경우 다른 것보다 찾기가 더 쉬울 수 있습니다. 그러나 일반적으로 말하면 >&2
.
/dev/stderr는 프로그램이 지정된 파일 이름에 오류를 기록하지만 stderr을 지원하지 않는 경우 유용할 수 있습니다. 분명히 이것은 약간 고안된 것입니다. /dev/stdout이 더 유용합니다. (최근에 mysql_safe
래퍼 스크립트가 콘솔에 오류를 기록하지 않는다는 사실을 발견했습니다 . 불행히도 오류 로그 파일에 대한 권한도 변경하려고 하므로 /dev/stderr을 사용하면 일부 중복된 경고가 발생합니다.)