다음 쉘 스크립트가 있습니다.
error=$(mkdir test 2>&1)
오류가 있으면 "error" 변수가 mkdir 명령의 오류 결과를 얻게 된다는 것을 알고 있지만 2>&1이 어떻게 작동하는지 이해할 수 없습니다. 누군가 설명할 수 있습니까? 감사해요!
답변1
문법
x="$(some_command)"
실행됩니다 some_command
그리고산출반환되어 변수에 저장됩니다 "$x"
.
이제 일반적으로 프로그램은 "표준 출력" 스트림( stdout
, 파일 핸들 #1)으로 "정상 출력"을 보내고 "표준 오류" 스트림( stderr
, 파일 핸들 #2)으로 오류 메시지를 보냅니다.
리디렉션 2>&1
의미는 (대략 말하면, 실제로는 약간 복잡합니다) "보내다 stderr
" 를 의미합니다 stdout
. 따라서 오류 메시지와 출력 메시지가 혼합됩니다.
따라서 우리는 두 가지를 결합할 수 있습니다:
x="$(some_command 2>&1)"
출력을 반환합니다그리고오류 메시지를 입력하고 $x
.
당신의 경우에는
error="$(mkdir test 2>&1)"
이는 $error
출력(비어 있음)과 오류(가능한오류가 발생한 경우 문자열을 포함합니다.) 결과에는 $error
명령의 오류 메시지가 포함됩니다 mkdir
.
우리는 이것을 실제로 볼 수 있습니다.
$ error="$(mkdir /)"
mkdir: cannot create directory '/': File exists
$ echo "$error"
$ error="$(mkdir / 2>&1)"
$ echo "$error"
mkdir: cannot create directory '/': File exists
첫 번째 경우에는 오류 메시지가 로 전송되는 즉시 인쇄되며 stderr
변수는 비어 있습니다. 두 번째 경우에는 stderr을 stdout으로 리디렉션하여 캡처하여 변수에 저장합니다 $error
.
답변2
시적인 용어로 이는 오류 스트림을 일반 출력과 동일한 "채널"로 보내는 것을 의미합니다. 2
오류를 나타냅니다. 1
메인라인인가요 아니면표준 출력. &1
표준 출력이 어디로 가야 하는지를 나타냅니다. 기본적으로 화면으로 이동하고 이 대체 컨텍스트에서는 $( )
변수로 이동하여 해당 값이 됩니다. 그리고 >
리디렉션입니다. 모두 합쳐서 2>&1
다음을 의미합니다. 오류를 표준 출력으로 리디렉션합니다.
답변3
$()
stderr을 stdout으로 리디렉션하여 stderr 및 stdout을 캡처합니다(명령이 stdout을 상위 셸에 연결하는 파이프를 대체한 후에 유효함).
in은 다른 파일 설명자를 참조하고 이름이 &
.>&1
1
2>
평소대로 stderr를 리디렉션하는 방법입니다.