답변:
POSIX 표준 지정 쉘 리디렉션에서 왼쪽에서 오른쪽으로된다; 즉, 순서가 중요합니다.
이 구문
2>&1은 표준 오류를 표준 출력과 동일한 파일로 리디렉션하는 데 종종 사용됩니다. 리디렉션은 처음부터 끝까지 이루어 지므로 리디렉션 순서가 중요합니다. 예를 들면 다음과 같습니다.ls > foo 2>&1표준 출력과 표준 오류를 모두 file로 지정합니다
foo. 하나:ls 2>&1 > foo표준 출력이 파일로 전송
foo되기 전에 표준 오류가 표준 출력으로 복제 되었기 때문에 표준 출력 만 파일로 보냅니다foo.
bash 표준의이 부분을 준수하여 작동합니다.
$ ls doesnotexist > foo 2>&1
$ cat foo
ls: cannot access doesnotexist: No such file or directory
$ ls doesnotexist 2>&1 > foo
ls: cannot access doesnotexist: No such file or directory
$ cat foo
$
배관은
표준 입력 또는 표준 출력 또는 파이프 라인 할당은 리디렉션 전에 수행되므로 리디렉션을 통해 수정할 수 있습니다. 예를 들면 다음과 같습니다.
$ command1 2>&1 | command2표준 출력과 표준 오류
command1를 모두 표준 입력으로 전송command2합니다.
ls > foo 2>&1말 했으므로 stdout을 foo로 리디렉션 한 다음 stderr을 stdout으로 리디렉션 해서는 안됩니다 . 그래서 이것은 작동하지 않아야합니다. 마찬가지로 두 번째 명령이 작동합니다. 내가 여기서 무엇을 놓치고 있습니까?
bash은 기본 동작이 다른 여기 에 설명 된 상황을 제외하고 일반적으로 POSIX를 준수 bash합니다. bash보다 적합 하게하려면 --posix옵션을 사용할 수 있습니다 .
ls > foo 2>&1는 다음과 같이 작동합니다. 먼저 표준 출력이로 리디렉션 된 foo다음 표준 오류가 표준 출력 (이제 파일)으로 리디렉션됩니다 foo. 두 번째 예 ls 2>&1 > foo는 다음과 같이 작동합니다. 표준 오류가 표준 출력으로 리디렉션되기 전에 표준 오류가 표준 출력으로 리디렉션 foo되므로 표준 오류가 파일로 전달되는 대신 로컬로 에코됩니다.
ls 2>&1 >foo 아마도 당신은 이것처럼 생각할 수 있습니다. 'ls'의 stderr이 stdout으로 리디렉션됩니다. 이런 일이 일어날 것입니다! stdout 과 관련된 추가 지시문에 관계없이 stdout이 현재 이동하도록 지정된 위치로 이동합니다. (이것은 주요 / 첫 번째 지시문 이므로) 그리고 그것은 ... 기억하십시오 : stderr은 실제로 stdout이되는 것으로 변환되지 않습니다 . 지시문 당시 stdout 이 지정된 위치로 이동합니다 . (예 : 터미널)