주문 리디렉션

주문 리디렉션

컴퓨터가 이 명령을 어떻게 읽는지 잘 모르겠습니다.

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

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

이 논리에 따라 명령은 다음과 같이 작동합니다.

  1. 파일 file1file2.

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

  3. 발행 된.stderrstdout

  4. 끝?

컴퓨터가 무엇을 하고 있는지 잘 모르겠습니다. 내 논리에 따르면 명령은 다음과 같아야합니다.

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의미합니다.

  1. 2(에 바인딩된) 이름의 stderr설명자를 다음으로 리디렉션합니다 .현재의1( ) 의 목적지는 stdout왼쪽에서 오른쪽으로 읽으면 터미널이다.
  2. 그런 다음 1( stdout)를 somefile디스크에 있는 파일인 으로 변경합니다.

따라서 이 경우에는 stderr터미널로 이동한 다음 stdout파일로 이동합니다. 이는 아마도 원하는 것이 아닐 것입니다.

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

  1. 리디렉션stdoutsomefile
  2. stderr그런 다음 ( )와 동일한 대상 으로 리디렉션됩니다 .stdoutsomefile

마지막 경우에 로 이동하면 stderr아마도 이것이 원하는 것일 것입니다.stdoutsomefile

답변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에 저장됩니다.stdoutstderrcatfile.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에 저장되지 않습니다.

관련 정보