나는 Linux 스크립트에서 명령 매개변수가 있다는 것을 보았고 > /dev/null 2>&1
이것이 출력을 null로 리디렉션하고 있다는 것을 알고 있습니다. 즉, 침묵을 의미합니다. 숫자 0,1,2(STDIN, STDOUT, STDERR)도 알고 있지만 이 줄이 왜 필요한지 이해가 되지 않습니다.
2>&1
기본적으로 차이점이 무엇인지 알고 싶습니다.
>/dev/null
그리고
>/dev/null 2>&1
답변1
2>&1
stdout이 현재 가리키는 위치로 stderr를 리디렉션합니다. 이 매개변수는 표준 출력(예: 명령을 통한 출력 삭제/무음)을 >/dev/null
리디렉션합니다 . /dev/null
그러나 stderr도 삭제(무음)하려는 경우 stdout을 로 리디렉션한 후 stderr을 동일한 위치로 리디렉션하도록 /dev/null
지정합니다 .2>&1
예(차이 시각화용):
$ ls
file1
file2
$ ls file1 > /dev/null
$
여기의 출력 은 로 전송 ls file1
되므로 아무것도 얻지 못합니다. 하지만:file1
/dev/null
$ ls file12 > /dev/null
ls: cannot access file12: No such file or directory
출력만 으로 전송되므로 stderr이 제공됩니다 /dev/null
.stderr도 삭제/무음화하려는 경우 stderr를 stdout으로 리디렉션하면 둘 다 다음으로 전송됩니다./dev/null
다음과 같이:
$ ls file12 >/dev/null 2>&1
$
노트리디렉션의 순서/순서가 중요합니다. 2>&1
표준 오류 리디렉션은 항상 표준 출력 리디렉션 후에 수행되어야 합니다. 그렇지 않으면 아무 작업도 수행되지 않습니다. 위의 예에서 실행하면 ls file12 2>&1 >/dev/null
stderr이 터미널에 인쇄되는 것을 볼 수 있지만 실행하면 ls file12 >/dev/null 2>&1
그렇지 않습니다.
- 또는
ls file1 file12 2>/dev/null 1>&2
동일한 효과를 얻을 수 있습니다. 먼저 stderr을 로 리디렉션한/dev/null
다음 stdout을 리디렉션하여 stderr이 현재 가리키는 동일한 위치를 가리키도록 합니다. - 최신 버전의 bash에서는 다음을 사용할 수도 있습니다.
>&
예:ls file12 >& /dev/null
stdout과 stderr을 다음으로 리디렉션합니다./dev/null
답변2
someprogram > /dev/null 2>&1
이것이 작동하는 방식은 표준 출력( &1
)이 로 리디렉션된 /dev/null
다음 표준 오류()가 리디렉션된 동일한 위치로 리디렉션된다는 것입니다 &2
. &1
stderr를 리디렉션하지 않으면 표준 출력이 제거되지만 표준 오류는 여전히 터미널로 전송됩니다.