返回顶部
首页 > 资讯 > 操作系统 >Bash中文件描述符的详细介绍
  • 504
分享到

Bash中文件描述符的详细介绍

bash文件描述符linuxbashbashstdin 2022-06-04 22:06:00 504人浏览 薄情痞子
摘要

前言 linux将所有内核对象当做文件来处理,系统用一个size_t类型来表示一个文件对象,比如对于文件描述符0就表示系统的标准输入设备STDIN,通常情况下STDIN的值为键盘,如read命令就默认从STDIN读取数据

前言

linux将所有内核对象当做文件来处理,系统用一个size_t类型来表示一个文件对象,比如对于文件描述符0就表示系统的标准输入设备STDIN,通常情况下STDIN的值为键盘,如read命令就默认从STDIN读取数据,当然STDIN的值是可以改变的,比如将其改成其他文件,这样的话想read等命令就会默认从相应的文件读取数据了。

简单地说,一个文件描述符可以和一个文件挂钩,一旦挂钩就可以通过取地址运算符&获得该文件的句柄,比如&0就可以获得STDIN设备在内存中的句柄(设备在系统中也被当做文件处理),可以这样理解,如果是一个shell中的普通变量var,可以通过$var的形式获得该变量所代表的值,而对于一个文件描述符fd,则可以通过&fd的形式获得文件描述符指向的文件的句柄,而这个句柄可以简单地理解成该文件的路径。

在 Shell 编程里经常会用到重定向操作, 它本质上是对文件描述符进行操作, 本文会对 Shell 脚本里的文件描述符做一个详细的介绍.

默认标准文件描述符

每个进程启动时默认都会有三个标准的文件描述符:

  • stdin 0 号描述符, 代表输入设备, 进程从它读入数据;
  • stdout 1 号描述符, 进程往其中写入数据;
  • stderr 2 号描述符, 进程会往其中写入错误信息;

这三个描述符默认是对应同一个 tty 设备, 这样我们便可以在终端中输入数据和获取进程的输出.

默认的文件描述符也是可以被替换的, 例如我们可以替换掉 stdout 到一个文件, 这样命令的输出就不是打印到终端, 而是被输出到文件中:

在上面的 demo 中, 我们先是通过 exec 1 > /tmp/stdout 把 stdout 指向了文件 /tmp/stdout, 紧接着我们执行了两条命令 ls 和 pwd, 可以看到此时终端已经没有了命令的输出. 当我们通过 exec 1 >&2 恢复 stdout 后, 可以发现文件 /tmp/stdout 里存储了之前命令的输出.

其中 exec 是一个 bash 内置命令, 不同于在终端中执行命令时会 fork 一个子进程, 通过 exec 执行的命令会直接修改当前的 shell 进程, 可以通过它执行命令来修改当前 shell 的 context.

如果你想使坏的话可以在别人的 ~/.bashrc 里加入 exec 1 > /tmp/stdout, 这样新开的所有的终端窗口里都看不到命令的输出, 要是因此被打概不负责 :) .

文件描述符的操作

Shell 中对文件描述符的操作由三部分组成: (Left, Operation, Right):

  • Left 可以是 0-9 的数字, 代表第 n 号文件描述符;
         Left 还可以为 &, 表示同时操作 stdout 和 stderr
  • Right 可以是文件名或 0-9 的数字, 当 Right 是数字时必须要加上 & 符号, 表示引用第 n 号文件描述符;
         Right 还可以为 &-, 此时表示关闭 Left 描述符, 例如 2<&- 表示关闭 stderr;
  • Operation 可以为 < 或 >;
         为 < 时表示以读模式复制 Right 到 Left, 此时如果没有指定 Left 的话, 则为默认值 0;
         当为 > 表示以写模式复制 Right 到 Left, 此时如果没有指定 Left 的话, 则为默认值 1;
         Operation 和 Left 之间不能有空格;
         当 Right 为文件名时, Operation 和 Right 可以有空格, 否则也不能有空格;

当存在多个文件描述符的操作时, 会按照从左往右的顺序依次执行. 例如通过命令 cmd 3>&1 1>&2 2>&3 3>&- 就可以交换 stdin 和 stdout.

我们通过下面的例子来验证上面的文件描述符交换是否生效:

  • 首先把默认的 stderr 重定向到文件 /tmp/stderr 中, 这样在终端中就不会看到错误输出了;
  • 当交换完 stderr 和 stdout 后, 我们就可以在 /tmp/stderr 文件中看到命令的正常输出了;

让我们来开始实验吧:


➜ test exec 2> /tmp/stderr
➜ test ls
a.txt
➜ test ls 3>&1 1>&2 2>&3 3>&-
➜ test cat /tmp/stderr
a.txt

和我们的预期时一致的!

一些示例

用文件重载 stdin :


➜ test cat 0< a.txt
hello
➜ test cat < a.txt # same with last command
hello

把 stderr 和 stdout 都过滤掉


ls not_exist 1> /dev/zero 2>&1
# another way
ls not_exist &> /dev/zero

处理上一个命令的错误输出:


➜ blog git:(hexo) ls not_exist 2>&1 | sed 's/not_exist/error/g'
ls: error: No such file or directory
# another way
➜ blog git:(hexo) ls not_exist |& sed 's/not_exist/error/g'
ls: error: No such file or directory

把标准输出转入到错误输出上: echo hello 1>&2

Process Substitution

在 bash 中提供了两个特殊的操作, 它们都可以被直接当成文件名使用:

  • <(cmd) : 可以看作时一个可读文件, cmd 命令的输出是这个文件的内容;
  • >(cmd) : 可以看作时一个可写文件, cmd 会接受输入并进行处理;

示例

利用 <(cmd) 来验证一对公私钥是否匹配:


➜ blog git:(hexo) diff <(ssh-keygen -y -e -f ~/.ssh/id_rsa) <(ssh-keygen -y -e -f ~/.ssh/id_rsa.pub)
➜ blog git:(hexo)

利用 >(cmd) 来对错误信息进行处理, 同时保证错 stderr 信息不回变成 stdout:


➜ blog git:(hexo) ls not_exist 2> >(sed 's/not_exist/keep_error/g')
ls: keep_error: No such file or directory
➜ blog git:(hexo)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

References

  • File Descriptors in Bourne shell
  • Process Substitution

--结束END--

本文标题: Bash中文件描述符的详细介绍

本文链接: https://lsjlt.com/news/19537.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Bash中文件描述符的详细介绍
    前言 linux将所有内核对象当做文件来处理,系统用一个size_t类型来表示一个文件对象,比如对于文件描述符0就表示系统的标准输入设备STDIN,通常情况下STDIN的值为键盘,如read命令就默认从STDIN读取数据...
    99+
    2022-06-04
    bash 文件描述符 linux bash bash stdin
  • python描述符的简单介绍
    这篇文章主要介绍“python描述符的简单介绍”,在日常操作中,相信很多人在python描述符的简单介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python描述符的简单介绍”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-01
  • Bash中的&符号和文件描述符如何理解
    这篇文章将为大家详细讲解有关Bash中的&符号和文件描述符如何理解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在我们探究大多数链式 Bash 命令中出现的所有的杂项符号(&、|、;...
    99+
    2023-06-16
  • 详解Android文件描述符
    介绍文件描述符的概念以及工作原理,并通过源码了解 Android 中常见的 FD 泄漏。 一、什么是文件描述符? 文件描述符是在 Linux 文件系统的被使用,由于Android基 ...
    99+
    2024-04-02
  • Linux在Bash脚本中如何关闭文件描述符
    这篇文章主要介绍了Linux在Bash脚本中如何关闭文件描述符,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Linux 在Bash脚本中怎么关闭文件描述符的实例在写一个Bas...
    99+
    2023-06-09
  • Pythonwheel文件详细介绍
    目录1. wheel介绍2. wheel的类型3. 创建wheel4. 导入使用wheel1. wheel介绍 .whl文件(WHL file)也称为轮子(wheel),这是用于py...
    99+
    2024-04-02
  • Dockerfile文件详细介绍
    目录一. dockerfile的介绍1.1 关于dockerfile1.2 dockerfile文件的组成部分1.3 dockerfile的执行二. docker bulid 命令的...
    99+
    2023-05-15
    Dockerfile文件详解 Dockerfile文件
  • Linux 在Bash脚本中怎么关闭文件描述符的实例
    Linux 在Bash脚本中怎么关闭文件描述符的实例 在写一个Bash脚本的时候碰到一个问题,这个脚本是用来启动一个程序B的,而这个脚本又被另一个程序A调用,结果发现新启动的B进程中有很多A进 程打开的文件...
    99+
    2022-06-04
    脚本 实例 文件
  • Linux的文件描述符、文件指针、索引节点详情
    目录linux--文件描述符、文件指针、索引节点一、Linux —— 文件描述符1、文件描述符 Fd2、系统级的文件描述符表3、文件系统的inode表二、文件指针 *FILE三、索引节点 Inode1、Inode特殊作用...
    99+
    2022-06-04
    Linux的文件描述符 Linux的文件指针 Linux的索引节点
  • MySQL 中字符集详细介绍
    目录mysql 中的 UTF8修改MySQL数据库的编码字符集的比较规则MySQL查询时区分大小写MySQL 中的 UTF8 在 MySQL 中, utf8 编码格式有点特殊, 它不是我们通常用到的 utf8, 而是 u...
    99+
    2024-04-02
  • MySQL 中字符集详细介绍
    目录MySQL 中的 UTF8修改MySQL数据库的编码字符集的比较规则MySQL查询时区分大小写MySQL 中的 UTF8 在 MySQL 中, utf8 编码格式有点特殊, 它不...
    99+
    2024-04-02
  • Linux 文件权限的详细介绍
    linux 的优秀之处就在于它的多用户、多任务的系统。Linux 一般将文件可存取访问的身份分为 3 个类别,分别是 owner、group、others,且 3 种身份各有 read、write、execute 等权限...
    99+
    2022-06-04
    Linux 文件权限
  • mycat配置文件的详细介绍
    这篇文章主要为大家分享mycat的配置文件。文中还介绍了mycat常用的几个分片算法的计算过程和使用方法,希望大家通过这篇文章能有所收获。常用配置文件间的关系由上图可以看到 Mycat 的核心配置文件均采用...
    99+
    2024-04-02
  • djangosettings.py配置文件的详细介绍
    配置文件如下,下面对配置文件进行一一解释 """ Django settings for film1_manager project. Generated by 'django-a...
    99+
    2024-04-02
  • Spring配置文件的详细介绍
    目录 1. Spring的配置文件的命名 2. Spring配置文件中有什么 3. set注入 4. 构造注入 1. Spring的配置文件的命名 答:Spring的配置文件是放在resources文件夹下面的,一般我们都会给他起一个...
    99+
    2023-09-18
    spring set注入 构造注入 bean标签 java
  • 详细介绍Spring的配置文件
    目录1. Spring的配置文件的命名2. Spring配置文件中有什么3. set注入4. 构造注入1. Spring的配置文件的命名 答:Spring的配置文件是放在resour...
    99+
    2022-11-13
    Spring 配置文件
  • 详解Python中的Descriptor描述符类
    描述符是调和属性访问的一个类。描述符类可用来获取、设置或删除属性值。描述符对象是在类定义的时候构建在一个类中的。 一般来说,描述符是一个具有绑定行为的对象属性,其属性的访问被描述符协议方法覆写。这些方法是_...
    99+
    2022-06-04
    详解 Python Descriptor
  • PythonDjango中间件详细介绍
    目录一 .中间件简介二 .编写自己的中间件三 .中间件执行流程一 .中间件简介 中间件是Django请求/响应处理的钩子函数。它是一个轻量级的、低级的"插件系统"...
    99+
    2024-04-02
  • React组件的生命周期详细描述
    目录一、什么是生命周期二、装载过程1、constructor2、render3、componentWillMount和componentDidMount三、更新过程1、compone...
    99+
    2024-04-02
  • VBScript运算符的详细介绍
    这篇文章主要讲解了“VBScript运算符的详细介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“VBScript运算符的详细介绍”吧!VBScript 运算符VBScript 有一套完整的...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作