/dev/null 2>&1에 2>&1이 필요한 이유는 무엇입니까?

/dev/null 2>&1에 2>&1이 필요한 이유는 무엇입니까?

나는 Linux 스크립트에서 명령 매개변수가 있다는 것을 보았고 > /dev/null 2>&1이것이 출력을 null로 리디렉션하고 있다는 것을 알고 있습니다. 즉, 침묵을 의미합니다. 숫자 0,1,2(STDIN, STDOUT, STDERR)도 알고 있지만 이 줄이 왜 필요한지 이해가 되지 않습니다.

2>&1

기본적으로 차이점이 무엇인지 알고 싶습니다.

>/dev/null

그리고

>/dev/null 2>&1

답변1

2>&1stdout이 현재 가리키는 위치로 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/nullstderr이 터미널에 인쇄되는 것을 볼 수 있지만 실행하면 ls file12 >/dev/null 2>&1그렇지 않습니다.

  • 또는 ls file1 file12 2>/dev/null 1>&2동일한 효과를 얻을 수 있습니다. 먼저 stderr을 로 리디렉션한 /dev/null다음 stdout을 리디렉션하여 stderr이 현재 가리키는 동일한 위치를 가리키도록 합니다.
  • 최신 버전의 bash에서는 다음을 사용할 수도 있습니다.>&예: ls file12 >& /dev/nullstdout과 stderr을 다음으로 리디렉션합니다./dev/null

답변2

someprogram > /dev/null 2>&1이것이 작동하는 방식은 표준 출력( &1)이 로 리디렉션된 /dev/null다음 표준 오류()가 리디렉션된 동일한 위치로 리디렉션된다는 것입니다 &2. &1stderr를 리디렉션하지 않으면 표준 출력이 제거되지만 표준 오류는 여전히 터미널로 전송됩니다.

관련 정보