추가 파일 설명자를 사용하는 방법을 완전히 이해하지 못했습니다. 나는 이를 사용하여 유틸리티의 기능을 에뮬레이트하고 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>&1
fd 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
>&1
date
file
답변2
아니요, 출력을 복제하지 않기 때문입니다. 파일 설명자를 복사하려면 해당 설명자를 두 번 출력해야 합니다.
다음과 같이 루프를 사용하여 이 작업을 수행할 수 있습니다.
while read l
do
echo "$l" >&3
echo "$l" >&4
done
이진 데이터의 경우 오류가 발생합니다(0이 청크되고 crlf -s가 lf로 변환됨).
귀하의 예는 다음과 같습니다.
- fd 3을 파일로 열기
- fd 1을 다음으로 복제합니다.fd3 대신(즉.폐쇄이전 fd3을 사용하고 fd3을 이전 stdout의 "대체 주소"로 만듭니다.
리디렉션은 본질적으로 복제본이며 Unix 용어로는 하드 링크와 같습니다. 명령 접미사를 사용하면 3>&1
fd 3과 fd 1이 동일한 엔터티를 가리키게 됩니다(현재로서는 file
).
man 3 dup2
C에 조금이라도 관심이 있다면 fd 리디렉션이 수행하는 기능인 a를 확인하고 싶습니다 .