리디렉션 순서 읽습니다. 파일을 연결 file1하고

컴퓨터 가이 명령을 읽는 방법을 잘 모르겠습니다.

cat file1 file2 1> file.txt 2>&1

이해하면 2>&1간단히 표준 오류를 표준 출력으로 리디렉션하십시오.

그 논리에 따라 명령은 다음과 같이 나에게 읽습니다.

  1. 파일을 연결 file1하고 file2.

  2. stdout이 작업에서으로 보냅니다 file.txt.

  3. 전송 stderrstdout.

  4. 종료?

컴퓨터가 무엇을하는지 잘 모르겠습니다. 내 논리에 따르면 명령은

cat file1 file2 2>&1 > file.txt

그러나 이것은 정확하지 않습니다.



답변

과제를 사용하는 것이 더 쉽다는 것을 알게되었습니다.

  • > 처럼 =
  • & 처럼 $

당신은 시작합니다

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.


답변

리디렉션 순서는 중요하며 왼쪽에서 오른쪽 으로 읽어야 합니다.

예를 들면 다음과
command 2>&1 >somefile같습니다.

  1. 리디렉션 stderr(즉 2받는) 현재 의 목적지 stdout(이 점에서, 단말).
  2. 그런 다음 stdout로 이동하십시오 somefile.

따라서이 경우 stderr터미널 stdout로 이동하여 파일로 이동하십시오. 원하는 파일이 아닙니다.

반면에 다음을 command >somefile 2>&1의미합니다.

  1. 리디렉션 stdoutsomefile
  2. 그런 다음 ( ) stderr와 동일한 대상으로 리디렉션 하십시오 .stdoutsomefile

이 마지막 경우 모두 stderrstdout이동하십시오 somefile.


답변

cat file1 file2 1> file.txt 2>&1

>& 실제로 중복을 의미하며 dup 시스템 호출을 사용하여 이미 열린 파일에 새 파일 설명자를 매핑합니다.

따라서, 당신은 (실제로 bash) 전에 먼저 새 stdout을 열고 “stdout이 현재 설정된 모든 표준으로 리디렉션하십시오”라고 말합니다.


답변