>&2를 사용하여 출력을 /dev/stderr로 보냅니다.

>&2를 사용하여 출력을 /dev/stderr로 보냅니다.

스크립트에서 오류는 일반적으로 파일 설명자 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을 사용하면 일부 중복된 경고가 발생합니다.)

관련 정보