![FD에 쓸 때 tee를 stdout으로 출력하려면 이 문자열을 사용하십시오.](https://linux55.com/image/177491/FD%EC%97%90%20%EC%93%B8%20%EB%95%8C%20tee%EB%A5%BC%20stdout%EC%9C%BC%EB%A1%9C%20%EC%B6%9C%EB%A0%A5%ED%95%98%EB%A0%A4%EB%A9%B4%20%EC%9D%B4%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%8B%AD%EC%8B%9C%EC%98%A4..png)
사용자 정의 파일 설명자에 쓸 때 tee를 출력하려고 합니다. 예:
exec 4>"/tmp/testfile.txt"; # open FD 4
tee -a >&4 <<< "Output this to stdout" # Write to open file
exec 4>&- # close FD
실행하면 tee -a /proc/self/fd/4 <<< "Output this to stdout"
터미널/표준 stdout에서 출력을 볼 수 있습니다.
BASH 5.0.16(1) 릴리스를 사용하고 있습니다.
FD 1(stdout)과 FD 4 사이에 연결을 설정하려고 시도했지만 문자열이 파일에 기록되지 않습니다.
감사합니다!
편집하다: @Stéphane Chazelas의 답변을 참조하세요. 아래 내 업데이트는 정확할 수 있지만 너무 복잡합니다.
고쳐 쓰다:
점점 가까워지고 있는 것 같아요. 이것을 시도하면 tee <<< "Output this to stdout" >(tee -a >&4)
실제로 터미널에서 출력을 볼 수 있고 파일에 기록되지만 어떤 이유로 내용을 덮어쓰고 추가(-a)하지 않는 것 같습니다.
업데이트 2: 이제 내 실수를 발견한 것 같습니다.
첫 번째:Bash Process Substitution을 사용하면 stdout으로 출력하고 tee를 사용하여 FD에 두 번 쓸 수 있습니다. 나는 이것을 이렇게 한다:
exec 4>"/tmp/testfile.txt"; # open FD 4
tee >(tee -a >&4) <<< "Output this to stdout" # Write to open file
exec 4>&- # close FD
언급한 대로 파일 내용을 덮어쓰게 되었는데, 이것이 답변의 두 번째 부분입니다.
두번째:나는 일자리를 찾는 것을 완전히 잊었습니다! 찾기 위치(또는 포인터)를 사용하여 파일을 열면 exec 4>"..."
파일의 시작 부분에 있습니다. 이 경우 추가는 파일을 덮어쓰는 것과 같습니다. 이 문제를 해결하려면 파일 설명자는 현재 위치를 파일 끝으로 설정하는 작업을 수행하기 전에 전체 파일을 읽어야 합니다. 한 가지 해결책은 을 사용하는 것입니다 cat
. 물론 읽기 위해 파일도 열어야 합니다(<>).
마침내: 이것은 나에게 효과적입니다. 파일의 FD를 열고 내용을 읽고 추가합니다.
exec 4<>"/tmp/testfile.txt"; # open FD 4 read (<) and write (>)
cat <&4 >/dev/null; tee >(tee -a >&4) <<< "Output this to stdout" # read fd (>/dev/null to silent the output) for correct position and append to. Also output to stdout
exec 4>&- # close FD (this closes it completly, so no need for exec 4<&-)
기억하다: 이는 파일을 수정하는 여러 프로세스를 사용하는 경우 실제로 주의해야 할 사항입니다. 내가 올바르게 이해했다면 이것은 "진짜" 추가 기능이 아닙니다. 예: 위치 3의 고양이를 만들었습니다. 동시에 다른 누군가가 파일에 두 줄을 추가했습니다. 이제 현재 알려진 위치를 사용하여 추가하면 다른 두 행은 손실됩니다.
나는 Unix 시스템에서 파일을 읽는 것에 대해 더 많은 것을 배운 것 같습니다. 전반적으로 FD를 개설하는 방안에 대해서는 신중히 생각해 보시는 것이 좋을 것 같습니다. 파일이 비어 있다는 것을 알고 있다면 괜찮습니다. 그러나 이미 콘텐츠가 포함된 파일에는 위험이 있을 수 있습니다. 포인터가 최신이 아닐 때 다른 프로세스가 포인터에 쓸 수 있습니다. 기술적인 측면에서는 잘못 해석했을 수도 있지만 어떤 측면에서는 정확해야 합니다.
답변1
fd 1과 4에 동일한 입력을 쓰려면 zsh
다음을 사용하여 수행할 수 있습니다.
cat <<< some-input >&1 >&4
(또는 기본값 <<< some-input >&1 >&4
인 경우 도 있음 )cat
$NULLCMD
in 에서 zsh
해당 옵션이 활성화된 경우(기본적으로 활성화되어 있음) 출력을 위해 multios
fd(여기서는 1 의 약자 >
)를 여러 번 리디렉션하면 fd가 내부 ing 프로세스로 리디렉션되어 다중화된 재사용이 모든 항목에 출력됩니다. 목표.1>
tee
이 기능은 <<<
(zsh 확장도 포함) 현재 꽤 많은 다른 쉘(zsh 포함 bash
) 에서 지원되지만 지원되지 않습니다 .multios
Linux 및 Cygwin 이외의 시스템에서는 다음을 수행할 수도 있습니다.
tee /dev/fd/4 <<< some-input
대부분의 시스템(위에서 언급한 2 제외)과 마찬가지로 열기 작업은 /dev/fd/4
fd 4를 복사하는 것과 동일한 작업을 수행합니다( 와 동일 {fd}>&4
).
그러나 Linux 및 Cygwin에서는 그렇지 않습니다. 대신 열기 /dev/fd/4
(여기서와 동일 /proc/self/fd/4
)는 해당 fd에 현재 열려 있는 파일을 처음부터 다시 여는 것처럼 작동합니다.
따라서 fd 4가 소켓을 가리키면 작동하지 않습니다.열려 있는()소켓이 일반 파일인 경우 >
파일이 잘립니다.
를 사용하면 tee -a /dev/fd/4 <<< some-input
잘림을 피할 수 있지만 fd 4는 유지되므로 fd 4에 다시 쓰면 출력 내용을 덮어쓸 수 있습니다 tee
. 그러기 위해서는 fd 4가 필요합니다.반품이를 방지하려면 추가 모드로 엽니다(모든 쓰기가 마지막에 수행되도록 보장).
행위:
tee >(cat >&4) <<< some-input
또한 이 문제를 해결하지만 추가 프로세스를 통해 데이터를 푸시하는 것을 의미합니다 cat
.
답변2
>
열고 잘라내고 >>
추가를 위해 엽니다.
따라서 다음을 원합니다.
exec 4>>"/tmp/testfile.txt";
tee -a
추가할 파일을 열지만 열려는 파일을 지정하지 않았으므로 아무런 효과가 없습니다. 를 사용하고 싶을 수도 있습니다 echo
.