error=$(mkdir test 2>&1) 이 표현은 무엇을 의미합니까?

error=$(mkdir test 2>&1) 이 표현은 무엇을 의미합니까?

다음 쉘 스크립트가 있습니다.

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은 다른 파일 설명자를 참조하고 이름이 &.>&11

2>평소대로 stderr를 리디렉션하는 방법입니다.

관련 정보