쉘 표준 스트림 재 지정 순서 OR 2> & 1 1 / dev / null vs 1> / dev / null 2> & 1 이렇게 읽었다. 1>/dev/null

누군가가 차이점을 명확히 해줄 수 있습니까? 그 중 일부는 모범 사례로 간주됩니까? 내가 올바르게 기억한다면 나는 어떻게 든 이렇게 읽었다. 1>/dev/null 이 앞에 와야합니다 : 2>&1

ls -al /doesNotExists 2>&1 1>/dev/null
ls -al /doesNotExists 1>/dev/null 2>&1

ls -al /doesNotExists 1>&2 2>/dev/null
ls -al /doesNotExists 2>/dev/null 1>&2

ls -la /doesNotExists 2<&1 1>/dev/null
ls -la /doesNotExists 2<&1 2>/dev/null

ls -la /doesNotExists 1<&2 1>/dev/null
ls -la /doesNotExists 1<&2 2>/dev/null

ls -la /doesNotExists 1>/dev/null 2<&1
ls -la /doesNotExists 2>/dev/null 2<&1

ls -la /doesNotExists 1>/dev/null 1<&2
ls -la /doesNotExists 2>/dev/null 1<&2


답변

셸 표준 스트림 리디렉션 순서

결과가 다른 경우 주문이 중요합니다. 첫 번째 예를 들어보십시오.

ls -al /doesNotExists 2>&1 1>/dev/null

이것은 표준 오류가 표준 출력으로 복제되었으므로 표준 출력 만 nul로 지시합니다 전에 표준 출력이 dirlist로 리디렉션되었습니다.

ls -al /doesNotExists 1>/dev/null 2>&1

이렇게하면 표준 출력과 표준 오류가 모두 null로 리디렉션됩니다.


Bash 참조 설명서 : 리디렉션

리디렉션 순서는 중요합니다. 예를 들어,
  명령

ls > dirlist 2>&1

표준 출력 (파일 설명자 1)과 표준 오류
  (파일 기술자 2)를 파일 dirlist에 보내고, 명령

ls 2>&1 > dirlist

표준 출력만을 파일 dirlist로 보냅니다. 왜냐하면 표준
  표준 이전에 표준 출력 사본이 만들어지지 않았습니다.
  출력이 dirlist로 리디렉션되었습니다.

출처 Bash 참조 설명서 : 리디렉션


지도 시간

에 그림이있는 튜토리얼이 있습니다. 일러스트 리디렉션 자습서 이를 쉽게 이해할 수 있습니다.

리디렉션 순서, 즉 “& gt; 파일 2 & 1″대 “2 & 1 & 1″파일

명령에서 재 지정이 나타나는 위치는 중요하지 않지만
  그들의 명령은 중요합니다. 왼쪽에서 오른쪽으로 설정됩니다.

2>&1 >file

일반적인 오류는 명령 2 & gt; 1 & gt;을 수행하는 것입니다. 파일을 stderr로 리다이렉트한다.
  파일로 stdout. 무슨 일이 일어나는지 보자. 먼저
  명령을 사용하는 경우 설명자는 다음과 같습니다.

                  ---       +-----------------------+
standard input   ( 0 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard output  ( 1 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard error   ( 2 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

그러면 우리 쉘인 Bash는 2> & amp; 1이므로 1을 복제하고, 파일
  설명자는 다음과 같습니다.

                  ---       +-----------------------+
standard input   ( 0 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard output  ( 1 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard error   ( 2 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

맞습니다. 아무것도 바뀌지 않았습니다. 2는 이미 동일한 것을 가리키고있었습니다.
  1. Bash는 & gt; 파일 및 따라서 stdout 변경 :

                  ---       +-----------------------+
standard input   ( 0 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard output  ( 1 ) ---->| file                  |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard error   ( 2 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

그리고 그것은 우리가 원하는 것이 아닙니다.

>file 2>&1

이제 올바른 명령 & gt; 파일 2 & amp; 1을 살펴 보겠습니다. 우리는
  이전 예와 Bash는 & gt; 파일:

                  ---       +-----------------------+
standard input   ( 0 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard output  ( 1 ) ---->| file                  |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard error   ( 2 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

그런 다음 우리의 복제가 2> & 1 :

                  ---       +-----------------------+
standard input   ( 0 ) ---->| /dev/pts/5            |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard output  ( 1 ) ---->| file                  |
                  ---       +-----------------------+

                  ---       +-----------------------+
standard error   ( 2 ) ---->| file                  |
                  ---       +-----------------------+

또한, 1과 2는 모두 파일로 리디렉션됩니다.