iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >Linux如何实现文件描述符和重定向
  • 491
分享到

Linux如何实现文件描述符和重定向

2023-06-13 03:06:02 491人浏览 八月长安
摘要

这篇文章主要介绍linux如何实现文件描述符和重定向,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!linux下的文件描述符是与文件输入、输出相关联的整数。它们用来跟踪已打开的文件。最常见的文件描述符是stdin、st

这篇文章主要介绍linux如何实现文件描述符和重定向,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

linux下的文件描述符是与文件输入、输出相关联的整数。它们用来跟踪已打开的文件。
最常见的文件描述符是stdin、stdout和stderr.我们可以将某个文件描述符的内容重定向到另一个文件描述符中。

下面给出一些对文件描述符进行操作和重定向的例子。

1 预备知识

我们在编写脚本时会频繁使用标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。

通过内容过滤将输出重定向到文件是我们从事的基础任务之一。

当命令输出文本时,这些输出文本有可能是错误信息,也可能是正常的(非错误的)输出信息。
单靠查看输出的文本本身,  我们无法区分哪些是正常的输出文本,哪些是错误文本。不过,我们可以通过文件描述符来解决这个问题,将那些与特定描述符关联的文本提取出来。
文件描述符是与一个打开的文件或数据流相关联的整数。文件描述符0、1以及2是系统预留的。
0——stdin(标准输入)
1——stdout(标准输出)
2——stderr(标准错误)

2  实战演练

将输出文本重定向或保存到一个文件中:

代码如下:


$echo"This is a sample text 1">temp.txt

这种方法通过截取文件的方式,将输出文本存储到文件temp.txt中,也就是说在把echo命令的输出写入文件之前,temp.txt中的内容首先会被清空。
接下来,再看另一个例子:
 

代码如下:


$echo "this is sample text 2" >>temp.txt

这种方法会将文本追加到目标文件中。
>和>>并不相同。尽管这两个操作符都可以将文本重定向到文件,但是前者会先清空文件,再写入内容;而后者会将内容追加到现有文件的尾部。
可以用下面的方法查看文件内容:

代码如下:


$cat temp.txt
this is sample text 1
this is sample text 2

在linux操作系统中,当使用重定向操作符时,重定向的内容不会出现在终端,而是直接被导入文件。重定向操作符默认使用标准输出。如果想使用特定的文件描述符,你必须将描述符置于操作符之前。

>等同于1>;对于>>来说,情况也类似(即>>等同于1>>)。
来看看什么是标准错误以及如何对它重定向。当命令输出错误信息时,stderr信息就会被打印出来。考虑下面的例子:
 

代码如下:


$ Is +
Is:cannot access +:No such file or directory

这里,+是一个非法参数,因些将返回错误信息。
[ 成功和不成功的命令
   当一个命令发生错误并退回时,它会返回一个非0的退出状态;而当命令成功完成后,它会返回数字0。退出状态可以从特殊变量$? 中获得(在命令执行语句之后立刻运行echo$?,就可以打印出退出状态)。]

将stderr文本打印到屏幕上,而不是文件中。

代码如下:


$ Is+>out.txt
Is:cannot access+:No such file or directory

然而在下面的命令中,stdout没有任何输出,因为错误已经重定向到out.txt中去了。

代码如下:


$ Is +2> out.txt # 正常运行

你可以将stderr单独重定向到一个文件,将stdout重定向到另一个文件:

代码如下:


$ cmd 2>stderr.txt 1>stdout.txt

还可以利用下面的方法将stderr转换成stdout,使得stderr和stdout都被重定向到同一个文件中:

代码如下:


$ cmd 2>&1 output.txt

或者采用下列方法:

代码如下:


$ cmd&> output.txt

有时候,在输出中可能包含一些不必要的信息(比如除错信息)。如果你不想让终端中充斥着有关stderr的繁枝末节,那么你可以将stderr的输出重定向到/dev/null, 保证一切都会被清除得干干净净。假设我们有三个文件,分别是a1、a2、a3。但是普通用户对a1没有“读一写一执行”权限。如果你需要打印文件名以a起始的所有文件的内容,你可以使用cat命令。
设置一些测试文件:

代码如下:


$ echo a1 >a1
$ cp a1 a2;cp a2 a3;
$ chmod 000 a1 #清除所有权限

尽管可以使用通配符(a*)显示所有的文件内容,但是系统会显示一个出错信息,因为对文件a1没有可读权限。

代码如下:


$ cat a*
cat:a1 permission denied
a1
a1

其中,cat:a1:permission denied 属于stderr。我们可以将stderr信息重定向到一个文件中,而stdout 仍然保持不变。考虑如下代码:

代码如下:


$ cat a* 2>err.txt #stderr被重定向到err.txt
a1
a1
$ cat err.txt
cat:a1:permission denied

观察下面的代码:

代码如下:


$ some_command 2>/dev/null

本节是 玩转Linux文件描述符和重定向 第二页的内容,欢迎大家继续阅读。

在这个示例中,来自stderr的输出被丢到文件/dev/null中。/dev/null是一个特殊的设备文件,这个文件接收到的任何数据都会被丢弃。

因此,null设备通常也被为位桶(bit bucket)或黑洞。
当对stderr或stdout进行重定向时,重定向的文本将传入文件。

因为文本已经被重定向到文件中,也就没剩下什么东西可以通过管道(|)传给接下来的命令,而这些命令是通过stdin来接收文本的。
但是有一个巧妙的方法可以一方面将数据重定向到文件,另一方面还可以提供一些重定向数据的副本作为后续命令的stdin。

这一切都可以使用tee来实现。

举个例子:要在终端中打印stdout,同时将它重定向到一个文件中,那么可以这样使用tee:

代码如下:


command | tee FILE1 FILE2

在下面的代码中,tee命令接收到来自stdin的数据。它将stdout的一份副写入文件out.txt,同时将别一份副本作为后续命令的stdin。命令cat -n将从stdin中接收到的每一行数据前加上行号并写入stdout:

代码如下:


$ cat a*| tee out.txt| cat -n
cat: a1: permission denied
1 a1
2 a1

查看out.txt 的内容:

代码如下:


$ cat out.txt
a1
a1

注意,cat:a1:permission denied并没有在任何文件内容中出现。这是因为这些信息属于stderr,而tee只能从stdin中进行读取。
默认情况下,tee命令会将文件覆盖,但是提供了一个-a选项,可以用于追加内容。例如:

代码如下:


$ cat a*| tee -a out.txt| cat -n.

带有参数的命令可以写成:command FILE1 FILE2依次类推,或者简简单单地用command FILE。
我们可以使用stdin作为命令参数。只需要将-作为命令的文件名参数即可:

代码如下:


$ cmd1 |cmd2 |cmd -

例如:

代码如下:


$ echo who is this | tee-
who is this
who is this

或者我们也可以将/dev/stdin作为输出文件名来使用stdin。
类似的,使用/dev/stderr代表标准错误,/dev/stdout代表标准输出。这些特殊的设备文件分别对应stdin、stderr和stdout。

补充内容:
从stdin读取输入的命令能以多种方式接收数据。另外,还可以用cat和管道来制定我们自己的文件描述符,例如:

代码如下:


$ cat file | cmd
$ cmd1 | cmd2

将文件重定向到命令
借助重定向,我们可以像使用stdin那样从文件中读取数据:

代码如下:


$ cmd <file

重定向脚本内部的文本块
有时候,需要对文本块(多行文本)像标准输入一样进行重定向。考虑一个特殊情况:源文本就位于shell脚本中。

来看下面这段shell脚本吧,向log文件中写入头部数据,可以按照下面的方法完成:

代码如下:


#!/bin/bash
cat <<EOF>log.txt
LOG FILE HEADER
This is a test log file
Function:System statistics
EOF

在cat <<EOF>log.txt与下一个EOF行之间的所有文本行都会被当做stdin数据。log.txt文件的内容打印如下:

代码如下:


$ cat log.txt
LOG FILE HEADER
This is a test log file
Function:System statistics

以上是“Linux如何实现文件描述符和重定向”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网操作系统频道!

--结束END--

本文标题: Linux如何实现文件描述符和重定向

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

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

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

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

下载Word文档
猜你喜欢
  • Linux如何实现文件描述符和重定向
    这篇文章主要介绍Linux如何实现文件描述符和重定向,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!linux下的文件描述符是与文件输入、输出相关联的整数。它们用来跟踪已打开的文件。最常见的文件描述符是stdin、st...
    99+
    2023-06-13
  • 【Linux】基础IO(万字详解) —— 系统文件IO | 文件描述符fd | 重定向原理
    🌈欢迎来到Linux专栏~~基础IO ...
    99+
    2023-09-05
    linux 运维 服务器
  • Bash中的&符号和文件描述符如何理解
    这篇文章将为大家详细讲解有关Bash中的&符号和文件描述符如何理解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在我们探究大多数链式 Bash 命令中出现的所有的杂项符号(&、|、;...
    99+
    2023-06-16
  • Linux中如何修改文件描述符的大小
    这篇文章主要介绍Linux中如何修改文件描述符的大小,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在Linux下默认的文件描述符大小为1024,可以通过下面的命令查看:[root@localhost ~]# ulim...
    99+
    2023-06-12
  • 【看表情包学Linux】文件描述符 | 重定向 Redirection | dup2 函数 | 缓冲区的理解 (Cache)
      🤣 爆笑教程 👉 《看表情包学Linux》👈 猛戳订阅  🔥 💭 写在前面:在上一章中,我们已经把 fd 的基本原理搞清楚了。本章我们将开始探索 fd 的...
    99+
    2023-09-02
    linux 运维 服务器 原力计划
  • Linux在Bash脚本中如何关闭文件描述符
    这篇文章主要介绍了Linux在Bash脚本中如何关闭文件描述符,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Linux 在Bash脚本中怎么关闭文件描述符的实例在写一个Bas...
    99+
    2023-06-09
  • Python如何实现HTTP文件重定向?
    HTTP文件重定向是指在HTTP协议中,服务器返回的响应状态码为3xx时,浏览器会自动跳转到新的URL地址。这种机制在网站开发中非常常见,例如当我们访问一个网站时,可能会自动跳转到登录页面、注册页面或者其他页面。在Python中,实现HT...
    99+
    2023-08-27
    http 文件 重定向
  • 如何在linux中解决文件描述符限制问题
    如何在linux中解决文件描述符限制问题?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一.问题描述在调试一个问题的时候,socket始终连接不上,返回的句柄大约...
    99+
    2023-06-09
  • 如何理解Linux文件重定向和文件过滤器
    本篇文章为大家展示了如何理解Linux文件重定向和文件过滤器,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Linux系统对所有的东西都是以文件的方式来进行管理的,我们有必要对有关文件的操作进行一些了...
    99+
    2023-06-16
  • 如何使用Java实现文件重定向和加载?
    在Java编程中,文件重定向和加载是非常常见的需求。本文将介绍如何使用Java实现文件重定向和加载,并且会穿插演示代码。 一、文件重定向 文件重定向指的是将一个程序原本输出到标准输出设备(通常是屏幕)的内容输出到一个文件中。在Java中,可...
    99+
    2023-09-05
    文件 重定向 load
  • 如何在Linux服务器上设置ulimit和文件描述符数限制
    这篇文章主要为大家展示了“如何在Linux服务器上设置ulimit和文件描述符数限制”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何在Linux服务器上设置ulimit和文件描述符数限制”这篇...
    99+
    2023-06-16
  • Linux下如何利用文件描述符恢复的成功失败实验
    这篇文章将为大家详细讲解有关Linux下如何利用文件描述符恢复的成功失败实验,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。数据误删除是作为初级运维人员常常遇到的“低级错误...
    99+
    2024-04-02
  • ASP 重定向:如何在 IDE 文件中实现?
    ASP(Active Server Pages)是一种动态网页技术,它允许程序员使用VBScript或JScript等脚本语言编写动态网页。在ASP中,重定向是一种常见的操作,它可以将用户从一个页面重定向到另一个页面。本文将介绍在IDE文...
    99+
    2023-10-30
    重定向 ide 文件
  • 二维码如何实现ASP文件重定向?
    在现代社会,二维码已经成为了一种非常流行的技术,它可以通过扫描二维码来实现快速访问某些网站或应用程序。而在ASP文件中,我们也可以使用二维码来实现重定向功能。 实现ASP文件的重定向功能,需要使用ASP中的Response对象。Respo...
    99+
    2023-10-28
    文件 二维码 重定向
  • Linux中如何增大可打开文件描述符的最大数
    这篇文章主要为大家展示了“Linux中如何增大可打开文件描述符的最大数”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux中如何增大可打开文件描述符的最大数”这篇文章吧。在安装Oracle ...
    99+
    2023-06-12
  • ASP文件和二维码:如何实现多功能重定向?
    在现代互联网时代,多功能重定向是一个非常重要的功能。当我们需要将网站的访问者重定向到不同的页面时,我们需要使用多功能重定向。在本文中,我们将介绍如何使用ASP文件和二维码来实现多功能重定向。 ASP文件是一种在服务器上运行的脚本语言,它可...
    99+
    2023-10-28
    文件 二维码 重定向
  • PHP 和 JavaScript 如何实现重定向?
    PHP 和 JavaScript 如何实现重定向? 重定向是指将浏览器请求的URL重定向到另一个URL,这是Web开发中非常常见的一种操作。在PHP和JavaScript中,我们都可以实现重定向,本文将介绍它们的具体实现方式。 一、PHP实...
    99+
    2023-08-14
    javascript 重定向 leetcode
  • PHP和Django如何实现重定向?
    PHP和Django如何实现重定向? 重定向是Web开发中常用的一种技术,它可以将用户从一个URL地址自动跳转到另一个URL地址,从而提升网站的用户体验。在本文中,我们将探讨PHP和Django如何实现重定向。 一、PHP实现重定向 在PH...
    99+
    2023-11-12
    django 教程 重定向
  • 二维码和ASP文件:如何实现重定向和数据传输?
    二维码是一种常见的二维条码,它能够存储大量的数据,被广泛应用于移动支付、电子门票等领域。而ASP文件是一种动态网页技术,可以实现服务器端的数据处理和动态内容生成。本文将介绍如何使用二维码和ASP文件实现重定向和数据传输。 一、二维码 二维...
    99+
    2023-10-28
    文件 二维码 重定向
  • Linux 重定向实战教程:如何利用 ASP 实现网页重定向?
    在网络开发中,网页重定向是一个非常常见的需求。通过重定向,我们可以将用户引导到正确的页面,或者让用户访问最新的内容。在 Linux 系统中,我们可以通过 ASP 脚本语言来实现网页重定向,这篇文章将为您介绍如何利用 ASP 实现网页重定向...
    99+
    2023-10-28
    教程 linux 重定向
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作