`ls 2 >tmp >tmp` 명령과 `ls > tmp` 명령의 차이점

`ls 2 >tmp >tmp` 명령과 `ls > tmp` 명령의 차이점

ls 2>tmp >tmp흑백의 차이점이 무엇인지 이해가 되지 않습니다 ls > tmp. 그것들은 모두 본질적으로 동일한 작업을 수행하는 것으로 보이며 tmp 파일을 만들고 명령의 결과를 저장합니다 ls.

답변1

짧은 대답: ls 2>tmp >tmp리디렉션 stdoutstderr파일로 tmp. 그리고 file ls > tmp로만 리디렉션됩니다 .stdouttmp

이것을 시도해보고 차이점을 확인하십시오.

$ ls asdsadasd 2>tmp >tmp
$ cat tmp
ls: cannot access asdsadasd: No such file or directory

$ ls asdsadasd > tmp
ls: cannot access asdsadasd: No such file or directory
$ cat tmp
<Nothing happen here>

답변2

다음과 같은 작업을 수행하면 안 됩니다.

ls 2> tmp > tmp

위의 셸은 tmp파일 설명자 2에 쓰기 위해 열리고, tmp다시 파일 설명자 1에 쓰기 위해 열리고, 다음을 실행합니다 ls.파일 설명자동일한 파일을 가리키는 두 개의 별도 열린 파일 설명.

파일 설명자 1(파일 목록의 경우 stdout)과 파일 설명자 2(오류 메시지의 경우 stderr)에 모두 기록 되면 ls이러한 출력은 서로 덮어쓰게 됩니다( tmp명명된 파이프가 아닌 일반 파일이라고 가정).

실제로 stdout 출력은 버퍼링되므로 종료하기 전에 끝까지 기록될 가능성이 높으므로 lsstderr 출력을 덮어쓰게 됩니다.

예:

$ ls /x /etc/passwd 2> tmp > tmp
$ cat tmp
/etc/passwd
ccess /x: No such file or directory

다음을 사용해야 합니다.

ls > tmp 2>&1

또는

ls 2> tmp >&2

이 경우 쉘은 tmpfd 2에서 열린 다음 해당 fd를 fd 1에 복사하므로 fd 1과 2는 동일한 열린 파일 설명을 공유 tmp하고 출력은 서로 덮어쓰지 않습니다.

$ ls /x /etc/passwd 2> tmp >&2
$ cat tmp
ls: cannot access /x: No such file or directory
/etc/passwd

관련 정보