쉘 표준 스트림 재 지정 순서 OR 2> & 1 1 / dev / null vs 1> / dev / null 2> & 1


3

누군가가 차이점을 명확히 해줄 수 있습니까? 그 중 일부는 모범 사례로 간주됩니까? 내가 올바르게 기억한다면 나는 어떻게 든 이렇게 읽었다. 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

2
독서 n>&m 같이, 리디렉션 스트림 n 어디로 m 현재 . 스트림을 리디렉션하지 않음 n 흐르다 m.
ctrl-alt-delor

답변:


7

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

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

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는 모두 파일로 리디렉션됩니다.


고마워, 멋진 그래픽. 단지 두 가지 설명 : 1. ls > /dev/null 그것은 같은 것인가? ls 1> /dev/null 2. 언제 < 익숙한? 나는 노력했다. ls -l >file &1<2 그리고 그것과 같지 않다. ls >file 2>&1. ~이다. cat file ~에 해당 cat <file 그와 동등하지 않은 예제가 있습니까? 고맙습니다
Wakan Tanka

@WakanTanka 1 / 예 (1은 표준 출력을 의미합니다). 2 / 리디렉션에 사용됩니다. 입력 (cat 파일은 cat & lt; file과 동일합니다)
DavidPostill

리다이렉트하는 것이 유용 할 때, 내가 보여준 것처럼 그것을 열 수 있습니다. 왜 리다이렉트합니까?
Wakan Tanka

코멘트에서 답을 명확하게하기 위해서 : cat <file 와 같다 cat file 왜냐하면 고양이는 인수가 없을 때 stdin에서 읽습니다. ls file 같지 않다. ls <file, 나중에 파일 내부의 파일 목록을 찾을 것으로 예상하고 전자는 하나의 단일 파일을 나열합니다. file.
Tiago

이 설명은 매우 좋습니다. 다이어그램을 가져 주셔서 감사합니다.
Jingguo Yao
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.