iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Bash中的&符号和文件描述符如何理解
  • 247
分享到

Bash中的&符号和文件描述符如何理解

2023-06-16 09:06:49 247人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关Bash中的&符号和文件描述符如何理解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在我们探究大多数链式 Bash 命令中出现的所有的杂项符号(&、|、;

这篇文章将为大家详细讲解有关Bash中的&符号和文件描述符如何理解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

在我们探究大多数链式 Bash 命令中出现的所有的杂项符号(&|;><{[()]} 等等)的任务中,我们一直在仔细研究 & 符号。

上次,我们看到了如何使用 & 把可能需要很长时间运行的进程放到后台运行。但是, 与尖括号 < 结合使用,也可用于将输出或输出通过管道导向其他地方。

在 前面的 尖括号教程中,你看到了如何使用 >,如下:

ls > list.txt

ls 输出传递给 list.txt 文件。

现在我们看到的是简写:

ls 1> list.txt

在这种情况下,1 是一个文件描述符,指向标准输出(stdout)。

以类似的方式,2 指向标准错误输出(stderr):

ls 2> error.log

所有错误消息都通过管道传递给 error.log 文件。

回顾一下:1> 是标准输出(stdout),2> 是标准错误输出(stderr)。

第三个标准文件描述符,0< 是标准输入(stdin)。你可以看到它是一个输入,因为箭头(<)指向0,而对于 12,箭头(>)是指向外部的。

标准文件描述符有什么用?

如果你在阅读本系列以后,你已经多次使用标准输出(1>)的简写形式:>

例如,当(假如)你知道你的命令会抛出一个错误时,像 stderr2)这样的东西也很方便,但是 Bash 告诉你的东西是没有用的,你不需要看到它。如果要在 home/ 目录中创建目录,例如:

mkdir newdir

如果 newdir/ 已经存在,mkdir 将显示错误。但你为什么要关心这些呢?(好吧,在某些情况下你可能会关心,但并非总是如此。)在一天结束时,newdir 会以某种方式让你填入一些东西。你可以通过将错误消息推入虚空(即 `/dev/null)来抑制错误消息:

mkdir newdir 2> /dev/null

这不仅仅是 “让我们不要看到丑陋和无关的错误消息,因为它们很烦人”,因为在某些情况下,错误消息可能会在其他地方引起一连串错误。比如说,你想找到 /etc 下所有的 .service 文件。你可以这样做:

find /etc -iname "*.service"

但事实证明,在大多数系统中,find 显示的错误会有许多行,因为普通用户对 /etc 下的某些文件夹没有读取访问权限。它使读取正确的输出变得很麻烦,如果 find 是更大的脚本的一部分,它可能会导致行中的下一个命令排队。

相反,你可以这样做:

find /etc -iname "*.service" 2> /dev/null

而且你只得到你想要的结果。

文件描述符入门

单独的文件描述符 stdoutstderr 还有一些注意事项。如果要将输出存储在文件中,请执行以下操作:

find /etc -iname "*.service" 1> services.txt

工作正常,因为 1> 意味着 “发送标准输出且自身标准输出(非标准错误)到某个地方”。

但这里存在一个问题:如果你想把命令抛出的错误信息记录到文件,而结果中没有错误信息你该怎么?上面的命令并不会这样做,因为它只写入 find 正确的结果,而:

find /etc -iname "*.service" 2> services.txt

只会写入命令抛出的错误信息。

我们如何得到两者?请尝试以下命令:

find /etc -iname "*.service" &> services.txt

&hellip;&hellip; 再次和 & 打个招呼!

我们一直在说 stdin0)、stdout1)和 stderr2)是“文件描述符”。文件描述符是一种特殊构造,是指向文件的通道,用于读取或写入,或两者兼而有之。这来自于将所有内容都视为文件的旧  UNIX 理念。想写一个设备?将其视为文件。想写入套接字并通过网络发送数据?将其视为文件。想要读取和写入文件?嗯,显然,将其视为文件。

因此,在管理命令的输出和错误的位置时,将目标视为文件。因此,当你打开它们来读取和写入它们时,它们都会获得文件描述符。

这是一个有趣的效果。例如,你可以将内容从一个文件描述符传递到另一个文件描述符:

find /etc -iname "*.service" 1> services.txt 2>&1

这会将 stderr 导向到 stdout,而 stdout 通过管道被导向到一个文件中 services.txt 中。

它再次出现:& 发信号通知 Bash 1 是目标文件描述符。

标准文件描述符的另一个问题是,当你从一个管道传输到另一个时,你执行此操作的顺序有点违反直觉。例如,按照上面的命令。它看起来像是错误的方式。你也行像这样阅读它:“将输出导向到文件,然后将错误导向到标准输出。” 看起来错误输出会在后面,并且在输出到标准输出(1)已经完成时才发送。

但这不是文件描述符的工作方式。文件描述符不是文件的占位符,而是文件的输入和(或)输出通道。在这种情况下,当你做 1> services.txt 时,你的意思是 “打开一个写管道到 services.txt 并保持打开状态”。1 是你要使用的管道的名称,它将保持打开状态直到该行的结尾。

如果你仍然认为这是错误的方法,试试这个:

find /etc -iname "*.service" 2>&1 1>services.txt

并注意它是如何不工作的;注意错误是如何被导向到终端的,而只有非错误的输出(即 stdout)被推送到 services.txt

这是因为 Bash 从左到右处理 find 的每个结果。这样想:当 Bash 到达 2>&1 时,stdout1)仍然是指向终端的通道。如果 find 给 Bash 的结果包含一个错误,它将被弹出到 2,转移到 1,然后留在终端!

然后在命令结束时,Bash 看到你要打开 stdout1) 作为到 services.txt 文件的通道。如果没有发生错误,结果将通过通道 1 进入文件。

相比之下,在:

find /etc -iname "*.service" 1>services.txt 2>&1

1 从一开始就指向 services.txt,因此任何弹出到 2 的内容都会导向到 1 ,而 1 已经指向最终去的位置 services.txt,这就是它工作的原因。

在任何情况下,如上所述 &> 都是“标准输出和标准错误”的缩写,即 2>&1

这可能有点多,但不用担心。重新导向文件描述符在 Bash 命令行和脚本中是司空见惯的事。

关于Bash中的&符号和文件描述符如何理解就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Bash中的&符号和文件描述符如何理解

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Bash中的&符号和文件描述符如何理解
    这篇文章将为大家详细讲解有关Bash中的&符号和文件描述符如何理解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在我们探究大多数链式 Bash 命令中出现的所有的杂项符号(&、|、;...
    99+
    2023-06-16
  • Linux在Bash脚本中如何关闭文件描述符
    这篇文章主要介绍了Linux在Bash脚本中如何关闭文件描述符,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Linux 在Bash脚本中怎么关闭文件描述符的实例在写一个Bas...
    99+
    2023-06-09
  • 详解Android文件描述符
    介绍文件描述符的概念以及工作原理,并通过源码了解 Android 中常见的 FD 泄漏。 一、什么是文件描述符? 文件描述符是在 Linux 文件系统的被使用,由于Android基 ...
    99+
    2024-04-02
  • Linux如何实现文件描述符和重定向
    这篇文章主要介绍Linux如何实现文件描述符和重定向,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!linux下的文件描述符是与文件输入、输出相关联的整数。它们用来跟踪已打开的文件。最常见的文件描述符是stdin、st...
    99+
    2023-06-13
  • Linux中如何修改文件描述符的大小
    这篇文章主要介绍Linux中如何修改文件描述符的大小,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在Linux下默认的文件描述符大小为1024,可以通过下面的命令查看:[root@localhost ~]# ulim...
    99+
    2023-06-12
  • 如何在linux中解决文件描述符限制问题
    如何在linux中解决文件描述符限制问题?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一.问题描述在调试一个问题的时候,socket始终连接不上,返回的句柄大约...
    99+
    2023-06-09
  • 详解Python描述符的工作原理
    目录一、前言二、什么是描述符?三、描述符协议四、描述符的工作原理五、数据描述符和非数据描述符六、描述符的使用场景七、function与method八、property/staticm...
    99+
    2024-04-02
  • Linux中如何增大可打开文件描述符的最大数
    这篇文章主要为大家展示了“Linux中如何增大可打开文件描述符的最大数”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux中如何增大可打开文件描述符的最大数”这篇文章吧。在安装Oracle ...
    99+
    2023-06-12
  • 浅谈JavaWeb中的web.xml配置部署描述符文件
    1、 定义头和根元素部署描述符文件就像所有XML文件一样,必须以一个XML头开始。这个头声明可以使用的XML版本并给出文件的字符编码。DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用的servlet规范的版本(如2.2或2....
    99+
    2023-05-31
    javaweb web.xml 配置部署
  • 如何在Linux服务器上设置ulimit和文件描述符数限制
    这篇文章主要为大家展示了“如何在Linux服务器上设置ulimit和文件描述符数限制”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何在Linux服务器上设置ulimit和文件描述符数限制”这篇...
    99+
    2023-06-16
  • Linux中通过Socket文件描述符寻找连接状态
    本篇内容介绍了“Linux中通过Socket文件描述符寻找连接状态”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Proc虚拟文件系统下面有许...
    99+
    2023-06-13
  • Linux下如何利用文件描述符恢复的成功失败实验
    这篇文章将为大家详细讲解有关Linux下如何利用文件描述符恢复的成功失败实验,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。数据误删除是作为初级运维人员常常遇到的“低级错误...
    99+
    2024-04-02
  • 【Linux】基础IO(万字详解) —— 系统文件IO | 文件描述符fd | 重定向原理
    🌈欢迎来到Linux专栏~~基础IO ...
    99+
    2023-09-05
    linux 运维 服务器
  • 导致IOError:[Errno 9]错误的文件描述符的原因是什么
    导致 IOError: [Errno 9] 错误的文件描述符的原因可能是以下几种情况:1. 文件描述符已经关闭:在尝试对已经关闭的文...
    99+
    2023-09-26
    IOError
  • 怎么在Linux服务器上设置ulimit和文件描述符数限制
    这篇文章主要为大家展示了“怎么在Linux服务器上设置ulimit和文件描述符数限制”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么在Linux服务器上设置ulimit和文件描述符数限制”这篇...
    99+
    2023-06-16
  • 【看表情包学Linux】文件描述符 | 重定向 Redirection | dup2 函数 | 缓冲区的理解 (Cache)
      🤣 爆笑教程 👉 《看表情包学Linux》👈 猛戳订阅  🔥 💭 写在前面:在上一章中,我们已经把 fd 的基本原理搞清楚了。本章我们将开始探索 fd 的...
    99+
    2023-09-02
    linux 运维 服务器 原力计划
  • 如何理解Linux Shell中的特殊符号
    本篇内容主要讲解“如何理解Linux Shell中的特殊符号”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Linux Shell中的特殊符号”吧!这些特殊符号罗列出来大致如下:代码如下:...
    99+
    2023-06-09
  • Linux下文件标述符和文件指针的示例分析
    这篇文章主要介绍了Linux下文件标述符和文件指针的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。   Linux下的文件标述符和文件指针文件标识...
    99+
    2023-06-09
  • 如何理解Vue中的事件处理和事件修饰符
    这篇文章将为大家详细讲解有关如何理解Vue中的事件处理和事件修饰符,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 <div id="root"&...
    99+
    2023-06-25
  • linux中如何实现bash字符串处理
    这篇文章给大家分享的是有关linux中如何实现bash字符串处理的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。取得字符串的长度代码如下:代码:%x="abcd"#方法一%expr length...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作