tee 유틸리티를 에뮬레이트하기 위해 추가 파일 설명자를 사용할 수 있습니까?

tee 유틸리티를 에뮬레이트하기 위해 추가 파일 설명자를 사용할 수 있습니까?

추가 파일 설명자를 사용하는 방법을 완전히 이해하지 못했습니다. 나는 이를 사용하여 유틸리티의 기능을 에뮬레이트하고 tee명령의 출력을 보면서 동시에 파일에 쓸 수 있다고 생각합니다. 또한 이렇게 하면 추가 파일 설명자를 사용하는 방법을 더 잘 이해하는 데 도움이 될 것이라고 생각합니다...

지금까지의 나의 시도는,

date 3>&1 3>file

내 생각은 창조하는 것이다.반복으로1(표준 출력) 및 리디렉션write file이므로 평소처럼 터미널에 stdout을 쓰고파일에 씁니다.

그러나 이것은 작동하지 않습니다. 내가했을 때 cat file그것은 비어있었습니다. 내가 뭘 잘못했나요?

답변1

리디렉션 연산자다양성출력이 어디로 가는지(또는 입력이 어디서 오는지). 3>&1"파일 설명자 3이 파일 설명자 1이 현재 가리키는 곳(즉, 터미널)을 가리키도록 함"을 의미합니다. 3>file이는 "파일 설명자 3이 다음을 가리키도록 만듭니다 file"를 의미합니다. fd 3이 터미널을 가리키는 짧은 시간 동안에는 아무 일도 일어나지 않으므로 터미널 출력을 얻지 못합니다.

두 위치에서 동일한 데이터를 얻으려면 데이터를 복사해야 합니다. 이것이 직업이다 tee. 읽는 각 바이트에 대해 해당 바이트를 두 번 출력합니다(파일 인수와 표준 출력이 제공되는 경우).

>&때때로 복제라고 불리는 것에 대해 걱정하지 마십시오. 그것이 복사하는 것은파일 설명자: 3>&1fd 1을 fd 3에 복사합니다. 이는 fd 1에 전송된 데이터와 fd 3에 전송된 데이터가 병합되고 있음을 의미합니다. 둘 다 fd 1이 가리키는 위치로 전송됩니다.

그래픽 설명을 선호하는 경우 다음을 참조하세요.STDOUT과 STDIN을 연결한다는 것은 무엇을 의미합니까?그리고명령에 어떻게 여러 출력이 있을 수 있나요?

어쨌든, 귀하의 명령은 파일 설명자 3에 아무 것도 출력하지 않으므로 fd 3을 리디렉션해도 아무 것도 변경되지 않습니다. 이 date명령은 표준 출력(fd 1)에 기록하며 리디렉션하지 않습니다.


Zsh에는 다음과 같은 기능이 있습니다.여러 운영 체제이는 출력 리디렉션의 의미를 변경합니다. 동일한 파일 설명자에 동일한 명령에 대한 출력 리디렉션이 여러 개 있는 경우 첫 번째다양성이 설명자가 가리키는 위치이지만 후속 설명자는복사지정된 대상으로 데이터를 보냅니다. 예를 들어, stdout이 가리키는 위치를 제외하고 파일의 출력을 얻으려면 다음을 사용할 수 있습니다.

date >&1 >file

Zsh가 이를 수행하고 있습니다 tee. 리디렉션 순서가 중요합니다.  연산자가 평가될 때 표준 출력이 이미 존재하기 때문에 두 번 date >file >&1작성됩니다 .file>&1datefile

답변2

아니요, 출력을 복제하지 않기 때문입니다. 파일 설명자를 복사하려면 해당 설명자를 두 번 출력해야 합니다.

다음과 같이 루프를 사용하여 이 작업을 수행할 수 있습니다.

while read l
do
   echo "$l" >&3
   echo "$l" >&4
done

이진 데이터의 경우 오류가 발생합니다(0이 청크되고 crlf -s가 lf로 변환됨).

귀하의 예는 다음과 같습니다.

  1. fd 3을 파일로 열기
  2. fd 1을 다음으로 복제합니다.fd3 대신(즉.폐쇄이전 fd3을 사용하고 fd3을 이전 stdout의 "대체 주소"로 만듭니다.

리디렉션은 본질적으로 복제본이며 Unix 용어로는 하드 링크와 같습니다. 명령 접미사를 사용하면 3>&1fd 3과 fd 1이 동일한 엔터티를 가리키게 됩니다(현재로서는 file).

man 3 dup2C에 조금이라도 관심이 있다면 fd 리디렉션이 수행하는 기능인 a를 확인하고 싶습니다 .

관련 정보