Bash IO 重定向,打开和关闭“fd”,有人可以解释一下吗?

Mév*_*pek 1 bash io

多年来我一直试图理解这个概念,但目前对此的了解并不完整。

这里的任何人都可以制作一种教程或很好的解释,并举例说明如何

  • 打开一个新的fd
  • 读自fd
  • 使用fd
  • 关闭fd

我已阅读https://www.gnu.org/software/bash/manual/html_node/Redirections.htmlman bash,但不清楚,根本没有具体且可理解的示例。

如果有人能很好地解释它,这将是一个有价值的答案,不仅对我而言。语法大多数时候都有点混乱。
有时需要exec,有时不需要。

Sté*_*las 7

Bourne-like shell 的一些翻译:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n
系统调用外壳接口贝壳评论
open("file", O_RDONLY)exec 3< file全部此处在 fd 3\xc2\xb9 上打开
open("file", O_RDONLY)exec {fd}< filezsh ksh93 bashfd 返回于$fd\xc2\xb2
open("file", O_WRONLY|O_TRUNC|O_CREAT)exec 3> file全部\xc2\xb3
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/系统模块中
dup2(4, 5)exec 5>&4全部与...一样exec 5<&4
dup(4)exec {fd}>&4zsh ksh93 bashfd 返回$fd
write(4, data, length)print -rnu4 -- "$data"克什兹什bash 还有一个可加载的print内置示例5
write(...)syswrite ...桀骜在 zsh/系统模块中
read(4, var...)sysread -i 4 ... var桀骜zsh/system在模块中
read(4, var...)IFS= read -ru4 ... varksh zsh bash读取一行。谨防限制。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/系统模块6中
pipe()exec 4>>|5亚什fd 4 写端,5 读端
fstat(4, var)zstat -f 4 -H var桀骜在 zsh/stat 模块中
select(...)zselect ...桀骜在 zsh/zselect 模块中
\n
\n

zsh 还具有一些zsh/net/socket, zsh/net/tcp,zsh/zpty模块来创建操作其他类型的 fd。

\n

使用exec更改 shell 进程的文件描述符。然而,大多数时候,您只想更改其他命令的文件描述符,例如仅在 fd 1 (stdout) 上打开ls -l dir/ > file(缩写)或一段代码:ls -l dir/ 1> filefilels

\n
{\n  echo Some Header\n  ls -l dir/\n} 1> file 2>> error.log\n
Run Code Online (Sandbox Code Playgroud)\n

foo | bar在并发进程中执行pipe()7后跟一些dup2()s 或等效项和close()s,因此将运行的进程的 fd 1foo转到管道的写入端,而 fd 0 或bar转到读取端。其他使用或可能使用管道的 shell 结构包括命令替换 ( var=$(cmd), var=`cmd`)、类似 Korn 的 shell 进程替换 ( foo <(bar) >(baz))、协同进程、yash 进程重定向。

\n
\n

ksh93 和 bash 中的 \xc2\xb9 ,如果file/dev/tcp|udp/host/port,它不会执行真正的打开,而是创建一个网络套接字。

\n

\xc2\xb2 对于其他>, >>, <>,> 运算符也可以这样做

\n

\xc2\xb3 如果noclobber打开该选项,O_EXCL如果目标是常规文件,则添加 a,可以使用>|>!运算符绕过,具体取决于 shell

\n

4在 Bourne shell 中,没有O_APPEND,但是 shell 在 open 后求到底

\n

5在其他 shell 中,您始终可以执行printf %s "$var" >&4. 这不会写入 fd 4,而是写入 fd 1,经过一段时间后dup2(4, 1)实际上达到了相同的目标。对于 也一样IFS= read -r line <&4

\n

6另请参阅systell(fd)返回 fd 位置的数学函数,它是另一个接口lseek()

\n

7某些使用socketpair()s 而不是管道的系统上的 ksh93 除外。对于其他一些使用管道的结构也是如此。

\n