컴퓨터가 이 명령을 어떻게 읽는지 잘 모르겠습니다.
cat file1 file2 1> file.txt 2>&1
이해한다면 2>&1
표준 오류를 표준 출력으로 리디렉션하십시오.
이 논리에 따라 명령은 다음과 같이 작동합니다.
파일
file1
과file2
.stdout
이 작업에서 로 보냅니다file.txt
.발행 된.
stderr
stdout
끝?
컴퓨터가 무엇을 하고 있는지 잘 모르겠습니다. 내 논리에 따르면 명령은 다음과 같아야합니다.
cat file1 file2 2>&1 > file.txt
그러나 이것은 옳지 않습니다.
답변1
과제를 사용하는 것이 더 쉽다고 생각합니다.
>
처럼=
&
처럼$
당신은 시작
1 = /dev/tty
2 = /dev/tty
1> file.txt 2>&1
첫 번째 예 는
1 = file.txt
2 = $1 # and currently $1 = file.txt
당신에게 맡겨주세요
1 = file.txt
2 = file.txt
다른 방법으로 하면 다시 시작됩니다
1 = /dev/tty
2 = /dev/tty
2>&1 > file.txt
그 다음에
2 = $1 # and currently $1 = /dev/tty
1 = file.txt
그래서 최종 결과는
1 = file.txt
2 = /dev/tty
그리고 당신은 리디렉션만 stdout
하지 않고 리디렉션만 했습니다 stderr
.
답변2
리디렉션 순서가 중요하므로 읽어야 합니다.왼쪽에서 오른쪽으로.
예를 들어, 다음을
command 2>&1 >somefile
의미합니다.
2
(에 바인딩된) 이름의stderr
설명자를 다음으로 리디렉션합니다 .현재의1
( ) 의 목적지는stdout
왼쪽에서 오른쪽으로 읽으면 터미널이다.- 그런 다음
1
(stdout
)를somefile
디스크에 있는 파일인 으로 변경합니다.
따라서 이 경우에는 stderr
터미널로 이동한 다음 stdout
파일로 이동합니다. 이는 아마도 원하는 것이 아닐 것입니다.
반면에 다음을 command >somefile 2>&1
의미합니다.
- 리디렉션
stdout
somefile
stderr
그런 다음 ( )와 동일한 대상 으로 리디렉션됩니다 .stdout
somefile
마지막 경우에 로 이동하면 stderr
아마도 이것이 원하는 것일 것입니다.stdout
somefile
답변3
cat file1 file2 1> file.txt 2>&1
>&
실제로 복제를 의미하는 것은 dup 시스템 호출을 사용하여 새 파일 설명자를 이미 열려 있는 파일에 매핑한다는 것입니다.
따라서 (실제로 bash) 먼저 새 stdout을 연 다음 "stderr를 현재 설정된 stdout으로 리디렉션"이라고 말해야 합니다.
답변4
이 명령은 명령의 합계를 전송합니다 cat file1 file2 > file.txt 2>&1
. 이제 이는 file1 또는 file2를 찾을 수 없는 경우에만 작동하며, 이 경우 "파일을 찾을 수 없음"이라는 오류 메시지가 file.txt에 저장됩니다.stdout
stderr
cat
file.txt
이는 와 동일합니다 cat file1 file2 &> file.txt
.
이제 리디렉션 순서가 중요합니다. 다음은 cat 명령의 stderr을 file.txt로 보내지 않고 터미널로 보냅니다.
$ cat file1 file2 2>&1 > file.txt
이는 먼저 stdout의 대상을 stderr에 복사하지만 이 단계의 stdout은 여전히 터미널을 가리키고 있기 때문입니다. 그런 다음 stdout을 file.txt로 리디렉션하여 stdout만 file.txt에 저장됩니다. 오류 메시지는 여전히 화면에 인쇄되며 file.txt에 저장되지 않습니다.