AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 736191
Accepted
Mévatlavé Kraspek
Mévatlavé Kraspek
Asked: 2023-02-21 04:14:35 +0800 CST2023-02-21 04:14:35 +0800 CST 2023-02-21 04:14:35 +0800 CST

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

  • 772

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

这里有没有人可以通过示例来制作一种教程或很好的解释

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

我已经阅读了https://www.gnu.org/software/bash/manual/html_node/Redirections.html和man bash,但不清楚,根本没有具体且易于理解的示例。

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

bash
  • 2 2 个回答
  • 66 Views

2 个回答

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2023-02-21T09:46:40+08:002023-02-21T09:46:40+08:00

    Bourne-like shell 的一些翻译:

    系统调用 外壳接口 贝壳 评论
    open("file", O_RDONLY) exec 3< file 全部 这里在 fd 3 开放
    open("file", O_RDONLY) exec {fd}< file zsh ksh93 庆典 $fdfd 在²中返回
    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 在 zsh/系统模块
    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" ksh zsh printbash也有一个 example loadable builtin 5
    write(...) syswrite ... zsh 在 zsh/系统模块
    read(4, var...) sysread -i 4 ... var zsh 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)) ksh93
    lseek(4, 123, SEEK_CUR) exec 4>#((CUR + 123)) ksh93
    lseek(4, 123, SEEK_END) exec 4>#((EOF + 123)) ksh93
    lseek(...) sysseek ... zsh 在 zsh/系统模块6
    pipe() exec 4>>|5 亚什 fd 4 写端,5 读端
    fstat(4, var) zstat -f 4 -H var zsh 在 zsh/stat 模块中
    select(...) zselect ... zsh 在 zsh/zselect 模块中

    zsh 也有一些zsh/net/socket, zsh/net/tcp,zsh/zpty模块来创建一个操作其他种类的 fds。

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

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

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


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

    ² 其他>, >>, <>,> 运营商也可以这样做

    ³ 如果noclobber打开该选项,O_EXCL则在目标是常规文件时添加 a,根据 shell可以使用>|或运算符绕过该文件>!

    4在Bourne shell中,没有O_APPEND,但是打开后shell会寻尾

    5在其他 shell 中,您始终可以这样做printf %s "$var" >&4。这不会写入 fd 4,而是写入 fd 1,经过一个临时的,dup2(4, 1)实际上实现了相同的目标。同样的IFS= read -r line <&4。

    6另见systell(fd)返回 fd 位置的数学函数,这是另一个接口lseek()

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

    • 4
  2. White Owl
    2023-02-21T07:25:23+08:002023-02-21T07:25:23+08:00

    首先,您不应将自己局限于 shell 脚本。文件描述符的概念来自操作系统和 C。Shell 脚本教科书提到文件描述符,但它们实际上隐藏在 shell 解释器本身内部。所以像“如何在 shell 中打开一个新的 fd”这样的问题实际上没有意义,因为你不直接在 shell 中使用文件描述符。

    要直接使用文件描述符,你必须使用 C。所有其他语言都是建立在用 C 编写的库和虚拟机之上的。所以,如果你对这个主题感兴趣,你必须学习 C。请不要将它与C++——这个也可以用于与操作系统的直接通信,但它有太多的“帮助内容”,这将成为理解操作系统任务的障碍。

    当然,您需要阅读有关操作系统组织方式的教科书。最好的书:Andrew Tanenbaum 着的《Modern Operating Systems》。它在任何书店和图书馆都可以买到。

    • -3

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve