파일 설명자 읽기

파일 설명자 읽기

이름이 지정된 파일의 내용file

testing 1
testing 2

테스트된 명령

exec 3<> ./tmp
cat file 1>&3 3>&1

아무것도 출력되지 않습니다. 왜?

나는 내 명령을 다음과 같이 읽었습니다.

cat파일 설명자의 내용을 file읽어서 STDOUT파일 설명자에 공급한 3다음, 파일 설명자의 내용을 가져와 3해당 내용을 파일 설명자에 공급합니다.STDOUT

제가 명령어를 잘못 읽었나요?

명령을 더 잘 이해하고 출력을 얻기 위해 어떻게 읽을 수 있습니까?file


Stéphane의 답변을 이해한 후 다음 명령을 시도했습니다.

cat file 1>&3 3> ofile

fd 3의 내용(fd 1, 즉 STDOUT에서 가져옴)을 쓰지 않습니다.ofile

하지만 다음 명령을 시도했습니다.

cat file 1>&3 && cat <3

fd 3의 내용을 STDOUT으로 인쇄합니다.

ofilefd 3에 fd 1의 내용이 있는데 왜 fd 3이 작성되지 않습니까?


Stéphane, Jesse_b 명령, 즉 아래 설명에서 언급한 명령

cat file 3> ofile 1>&3 

file작동하고 콘텐츠를 작성 ofile하지만 명령은

cat file 1>&3 3> ofile

앞서 언급했듯이 ofile.

1>&3끝과 시작의 위치는 3> ofile이 두 명령의 출력에 어떤 영향을 줍니까?

답변1

cmd x>&y다음과 같이 말하세요. "fd y가 리디렉션하는 리소스로 fd x를 리디렉션하세요."

그래서:

cat 1>&3 3>&1

catfd 1(stdout)이 fd 3에서 열린 리소스와 동일한 리소스로 이동해야 한다는 뜻인가요? 즉, 읽기 ./tmp+쓰기 모드로 열면 fd 3이 fd 1에서 열린 것과 동일한 리소스로 이동해야 한다는 뜻인가요? 그냥 넣어 로 설정되어 있습니다 ./tmp.

따라서 catfd 1과 3을 로 리디렉션하기 시작합니다 ./tmp. catfd 3에 아무 작업도 수행하지 않고 catfd 3을 원하는 대로 리디렉션할 수 있으며 아무 효과도 없습니다.

그러나 내용을 fd 1에 기록하므로 해당 내용이 의 시작 부분에 기록된 file것을 알 수 있습니다 .file./tmp

cat filefile콘텐츠를 한 번만 하나의 fd에만 씁니다 . file두 개의 다른 fd에 두 번 쓰는 것을 원한다면 다음을 원할 것입니다 tee.

존재하다

< file tee ./tmp

teefd 0(여기서는 읽기 전용 모드로 열도록 리디렉션됨 ) (잘린 쓰기 전용 모드로 열림) 에서 file읽은 내용을 fd 1(stdout)에 씁니다 ../tmp

tee열어 보라고 할 수도 있지만./tmp추가의mode 에서는 그런 잘림 없이 읽기+쓰기 모드로 열도록 -a지시할 수 없습니다 ../tmp3<>

이렇게 하려면 다음이 필요합니다.

< file tee /dev/fd/3 3<> ./tmp

Linux를 제외하고 작동하거나 zsh내장된 티 기능을 사용합니다.

cat < file 3<> ./tmp >&1 >&3 3>&-

fd 1이 두 번 리디렉션되고 zsh옵션이 활성화되면 mulltios(기본적으로 설정됨) 내부 tee가 실행되어 출력을 두 대상 모두에 전달합니다(읽기 cat출력을 실행하고 두 대상 프로세스의 내부 tee에 기록함으로써).

fd 3의 임시 사용은 다음 문제를 해결하는 것입니다:

cat < file >&1 1<> ./tmp

zsh는 불평할 것이다.zsh: file mode mismatch on fd 1 당신이 원한다고 가정하기 때문에 불평할 것입니다읽다에서 ./tmp.

관련 정보