FD에 쓸 때 tee를 stdout으로 출력하려면 이 문자열을 사용하십시오.

FD에 쓸 때 tee를 stdout으로 출력하려면 이 문자열을 사용하십시오.

사용자 정의 파일 설명자에 쓸 때 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해당 옵션이 활성화된 경우(기본적으로 활성화되어 있음) 출력을 위해 multiosfd(여기서는 1 의 약자 >)를 여러 번 리디렉션하면 fd가 내부 ing 프로세스로 리디렉션되어 다중화된 재사용이 모든 항목에 출력됩니다. 목표.1>tee

이 기능은 <<<(zsh 확장도 포함) 현재 꽤 많은 다른 쉘(zsh 포함 bash) 에서 지원되지만 지원되지 않습니다 .multios

Linux 및 Cygwin 이외의 시스템에서는 다음을 수행할 수도 있습니다.

tee /dev/fd/4 <<< some-input

대부분의 시스템(위에서 언급한 2 제외)과 마찬가지로 열기 작업은 /dev/fd/4fd 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.

관련 정보