리디렉션 순서


29

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

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

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

답변:


46

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

  • > 처럼 =
  • & 처럼 $

당신은 시작합니다

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.


나는 일종의 비유를 얻지 만 혼란 스럽습니다. 무엇 $을 의미합니까?
Eliran Malka

같은 할당에서 var=$othervar, $오른쪽에있는 변수 이름을 소개합니다. 같은 리디렉션에서 2>&1, &오른쪽에있는 파일 기술자 번호를 소개합니다. "파일 2는 파일 1과 같습니다"라고 생각할 수 있습니다. (그러나 <"읽기"와 >"쓰기"의 두 가지 유형이 있습니다.
Mikel

12

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

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

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

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

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

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

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


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

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

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


대단해! 나는 그것에 대해 궁금했다 &. 그 구문에 대한 언급이나 앞서 언급 한 dup 시스템에 대한 좋은 자료를 동봉 할 수 있습니까?
Eliran Malka

1
'man dup'은 시스템 호출을 문서화합니다.
X Tian

이해 :) 고맙습니다
Eliran Malka 7
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.