![Bash IO 리디렉션, "fd" 열기 및 닫기, 누군가 설명할 수 있습니까?](https://linux55.com/image/217226/Bash%20IO%20%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98%2C%20%22fd%22%20%EC%97%B4%EA%B8%B0%20%EB%B0%8F%20%EB%8B%AB%EA%B8%B0%2C%20%EB%88%84%EA%B5%B0%EA%B0%80%20%EC%84%A4%EB%AA%85%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
나는 수년 동안 이 개념을 이해하려고 노력해 왔지만 현재의 이해는 불완전합니다.
여기 누구든지 일종의 튜토리얼이나 예제를 통해 좋은 설명을 할 수 있습니까?
- 새로 열어
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/socket
도 zsh/net/tcp
있습니다 .zsh/zpty
exec
쉘 프로세스의 파일 설명자를 변경하는 데 사용됩니다 . 그러나 대부분의 경우 그냥 open on fd 1(stdout) ls -l dir/ > file
(약어) 또는 코드 조각과 같은 다른 명령에 대한 파일 설명자를 변경하려고 합니다.ls -l dir/ 1> file
file
ls
{
echo Some Header
ls -l dir/
} 1> file 2>> error.log
foo | bar
pipe()
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을 제외합니다 . 파이프를 사용하는 다른 구조물의 경우에도 마찬가지입니다.