스크립트의 리디렉션

스크립트의 리디렉션

저는 짧은 쉘 스크립팅 비디오 강좌를 수강하고 있으며 제공된 예 중 하나는 다음과 같습니다.

if [[ ! $1 ]]; then
    echo "Need line length argument" >&2
    exit 1
fi

강좌 자료에는 "이것은 표준 오류로 오류를 인쇄합니다."라고 나와 있습니다. 그러나 그것은 내 제한된 이해에 맞지 않습니다. 기본 파일 설명자(지정되지 않은 경우)는 "1"입니다(따라서 이 경우 stdout, 즉 다음과 같습니다). 위에 1>&2). 이것은 stdout을 stderr로 리디렉션/병합하는 것 같습니다.

리디렉션의 일부로 "&"가 작동하는 방식에 대한 정보가 누락되었나요?

답변1

그것은 단지 오해였습니다. "이것은 오류를 표준 오류로 인쇄하는 것입니다."는 "표준 오류는 출력이 끝나는 곳입니다"를 의미합니다. 맞습니다. "stdout을 stderr로 리디렉션/병합"입니다. 그러나 이것은 모순이 아니다.

명령은 이 변경 사항을 인식하지 못합니다. 이 명령은 stdout(예: fd 1) 로 인쇄됩니다 . 그러나 명령을 실행하기 전에 쉘이 stdout생성 됩니다 stderr.

$ strace -f bash -c '/bin/echo foo >&2'
[...]
dup2(1, 2)                  = 2
fcntl(1, F_GETFD)           = 0
execve("/bin/echo", ["/bin/echo", "foo"], 0x55ffb063e5d0 /* 103 vars */) = 0
[...]

man 2 dup

int dup2(int oldfd, int newfd);
dup() 시스템 호출은 가장 낮은 번호의 사용되지 않은 파일 설명자를 새 설명자로 사용하여 파일 설명자 oldfd의 복사본을 만듭니다.
성공적으로 반환되면 이전 파일 설명자와 새 파일 설명자를 서로 바꿔서 사용할 수 있습니다. 이들은 동일한 열린 파일 설명(open(2) 참조)을 참조하므로 파일 오프셋과 파일 상태 플래그를 공유합니다. 예를 들어 파일 설명자 중 하나에서 파일 오프셋을 수정하기 위해 lseek(2)를 사용하는 경우 다른 하나는 파일 설명자의 오프셋도 변경됩니다.
두 파일 설명자는 파일 설명자 플래그(close-on-exec 플래그)를 공유하지 않습니다. 중복된 설명자의 close-on-exec 플래그(FD_CLOEXEC; fcntl(2) 참조)가 꺼집니다.

답변2

또한@HaukeLaging의 답변, 당신 말이 맞습니다 >&2. 이것은 의 구문 설탕입니다 1>&2. &포인터나 간접 참조로 해석 되어야 합니다 . 기본적으로 1>&2명령에서는 "이 명령(또는 {}또는 을 사용하는 경우 명령 그룹 ())의 경우 파일 설명자 1이 단어를 처리하기 전에 파일 설명자 2가 가리키는 위치를 가리킵니다"를 의미합니다. 하지만 이건껍데기구문이며 명령의 매개변수가 아닙니다.

관련 정보