Bash IO 리디렉션, "fd" 열기 및 닫기, 누군가 설명할 수 있습니까?

Bash IO 리디렉션, "fd" 열기 및 닫기, 누군가 설명할 수 있습니까?

나는 수년 동안 이 개념을 이해하려고 노력해 왔지만 현재의 이해는 불완전합니다.

여기 누구든지 일종의 튜토리얼이나 예제를 통해 좋은 설명을 할 수 있습니까?

  • 새로 열어fd
  • 다음에서 읽기fd
  • 사용fd
  • 폐쇄fd

내가 읽고https://www.gnu.org/software/bash/manual/html_node/Redirections.html그러나 man bash불분명하고 구체적이고 이해 가능한 예가 전혀 없습니다.

누군가가 잘 설명해 준다면 나뿐만 아니라 귀중한 답변이 될 것이다. 구문은 대부분의 경우 약간 혼란스럽습니다.
필요할 때도 있고 exec그렇지 않을 때도 있습니다.

답변1

Bourne과 유사한 쉘의 일부 번역:

시스템 호출 쉘 인터페이스 껍데기 논평
open("file", O_RDONLY) exec 3< file 모두 여기 fd 3에서 열기
open("file", O_RDONLY) exec {fd}< file zsh ksh93 배쉬 fd는 $fd² 내에서 반환됩니다.
open("file", O_WRONLY|O_TRUNC|O_CREAT) exec 3> file 모두 입방체
open("file", O_WRONLY|O_APPEND|O_CREAT) exec 3>> file 모두 4
open("file", O_RDWR|O_CREAT) exec 3<> file 모두
open("file", ...) sysopen ... 다루기 힘든 zsh/system 모듈에서
dup2(4, 5) exec 5>&4 모두 그것은 같은exec 5<&4
dup(4) exec {fd}>&4 zsh ksh93 배쉬 fd 반환$fd
write(4, data, length) print -rnu4 -- "$data" 크쉬쉬 Bash print에는 로드 가능한 내장 예제 5 도 있습니다.
write(...) syswrite ... 다루기 힘든 zsh/system 모듈에서
read(4, var...) sysread -i 4 ... var 다루기 힘든 zsh/system모듈 내
read(4, var...) IFS= read -ru4 ... var ksh zsh 배쉬 한 줄을 읽으십시오. 제한사항에 주의하세요. 5
close(4) exec 4>&- 모두 또는exec 4<&-
lseek(4, 123, SEEK_SET) exec 4>#((123)) 크쉬 93
lseek(4, 123, SEEK_CUR) exec 4>#((CUR + 123)) 크쉬 93
lseek(4, 123, SEEK_END) exec 4>#((EOF + 123)) 크쉬 93
lseek(...) sysseek ... 다루기 힘든 zsh/system-module6 에서
pipe() exec 4>>|5 야쉬 fd 4 쓰기 끝, 5 읽기 끝
fstat(4, var) zstat -f 4 -H var 다루기 힘든 zsh/stat 모듈에서
select(...) zselect ... 다루기 힘든 zsh/zselect 모듈에서

zsh에는 다른 유형의 fd를 생성하고 작동하는 일부 모듈 zsh/net/socketzsh/net/tcp있습니다 .zsh/zpty

exec쉘 프로세스의 파일 설명자를 변경하는 데 사용됩니다 . 그러나 대부분의 경우 그냥 open on fd 1(stdout) ls -l dir/ > file(약어) 또는 코드 조각과 같은 다른 명령에 대한 파일 설명자를 변경하려고 합니다.ls -l dir/ 1> filefilels

{
  echo Some Header
  ls -l dir/
} 1> file 2>> error.log

foo | barpipe()7을 실행 한 다음 일부 dup2()s 또는 이에 상응하는 항목과 동시 프로세스의 s를 실행 close()하면 실행 중인 프로세스의 fd 1이 foo파이프의 쓰기 측으로 이동하고 fd 0 또는 bar읽기 측으로 이동합니다. 파이프를 사용하거나 사용할 수 있는 다른 쉘 구성에는 명령 대체( var=$(cmd), var=`cmd`), Korn과 유사한 쉘 프로세스 대체( foo <(bar) >(baz)), 코프로세스 및 yash의 프로세스 리디렉션이 포함됩니다.


¹ ksh93 및 bash에서 그렇다면 file실제 /dev/tcp|udp/host/port열기를 수행하지 않고 네트워크 소켓을 생성합니다.

² 다른 >, >>, <>, > 연산자도 이 작업을 수행할 수 있습니다.

³ noclobber옵션이 켜져 있는 경우 O_EXCL대상이 일반 파일인 경우 추가하십시오. 이는 셸에 따라 >|or 연산자를 사용하여 >!우회 할 수 있습니다.

4Bourne 쉘에는 가 없지만 O_APPEND쉘은 open 후 끝까지 탐색한다.

5 다른 쉘에서는 언제든지 할 수 있습니다 . 이것은 fd 4에 기록되지 않고 printf %s "$var" >&4잠시 후 dup2(4, 1)실제로 동일한 목표를 달성하는 fd 1에 기록됩니다. 에 대해서도 마찬가지입니다 IFS= read -r line <&4.

6systell(fd) 또 다른 인터페이스인 fd의 위치를 ​​반환하는 수학 함수 도 참조하세요 .lseek()

socketpair()7파이프 대신 s를 사용하는 일부 시스템에서는 ksh93을 제외합니다 . 파이프를 사용하는 다른 구조물의 경우에도 마찬가지입니다.

관련 정보