`echo 'hi' | tee > abc`는 왜 여러 파일을 생성하지만 `echo 'hi' > abc`는 생성하지 않습니까?

`echo 'hi' | tee > abc`는 왜 여러 파일을 생성하지만 `echo 'hi' > abc`는 생성하지 않습니까?

내 환경: zsh, macOS


관련 명령:

  1. echo 'hi' | tee > a b c
  2. echo 'hi' > a b c
  • a명령 1은 이름이 이고 내용이 b포함된 파일을 생성합니다 .chi
  • a명령 2는 content 라는 파일을 생성합니다 hi b c.

AFAIK, 그냥 명령 1을 사용하세요아니요 >다음 맨페이지에 문서화되어 있습니다 tee.

echo 'hi' | tee a b c

>위 코드(예: 명령 1)를 추가하면 여전히 여러 파일이 생성되는 반면 명령 2는 하나의 파일만 생성되는 이유를 이해하는 데 도움이 필요합니다 .

답변1

리디렉션( >이 경우)은 다음 매개변수를 리디렉션 대상으로 "사용"합니다. 그래서

echo 'hi' | tee > a b c

동등하다

echo 'hi' | tee b c > a

tee입력을 에 복사 b하고 c표준 출력을 에 복사합니다 a.

echo 'hi' > a b c

동등하다

echo 'hi' b c > a

표준 출력으로 출력하고 hi b c, 이는 a.

답변2

이것은 기본 쉘 구문입니다. 리디렉션 연산자는 >표준 출력을 리디렉션할 파일 이름으로 사용되는 하나의 인수만 허용합니다. 나머지 매개변수는 명령에 전달됩니다.

따라서 첫 번째 명령은 다음과 같습니다.

echo 'hi' | tee > a b c

명령을 실행하여 echo 'hi' | tee b c표준 출력을 file 로 리디렉션합니다 a. 공교롭게도 tee표준 입력은 표준 출력뿐만 아니라 인수로 제공된 모든 파일에 복사됩니다. 따라서 내보낸 데이터는 파일에 echo 'hi'복사되고 ( 파일 리디렉션을 통해) 표준 출력에 복사됩니다 .teebca

두 번째 명령:

echo 'hi' > a b c

명령을 실행하여 echo 'hi' b c표준 출력을 파일로 다시 리디렉션하십시오 a. 생성된 파일을 보면 a텍스트가 포함되어 있는 것을 볼 수 있지만 hi b c, 첫 번째 경우에는 생성된 세 파일 모두 텍스트만 포함되어 있습니다 hi.

답변3

tee표준 입력 스트림을 가져오고 지정된 파일 및 표준 출력에 복사본을 보냅니다. 를 사용하면 파일 에 정상적으로 쓰는 동안 > a표준 출력 스트림을 파일에 캡처할 수 있습니다 .ateebc

> filename|적절한 간격을 두고 이스케이프되지 않는 한 측면의 어느 지점에서나 나타날 수 있습니다 .

이를 설명하기 위해 다음은 동의어입니다.

echo hi | > a tee b c 
echo hi | tee > a b c 
echo hi | tee b > a c 
echo hi | tee b c > a

관련 정보