玩转Linux文件描述符和重定向
本文介绍linux中文件描述符与重定向的相关知识,文件描述符是与文件输入、输出相关联的整数,它们用来跟踪已打开的文件。有需要的朋友参考下。
linux下的文件描述符是与文件输入、输出相关联的整数。它们用来跟踪已打开的文件。
最常见的文件描述符是stdin、stdout和stderr.我们可以将某个文件描述符的内容重定向到另一个文件描述符中。
下面给出一些对文件描述符进行操作和重定向的例子。
1.5.1 预备知识
我们在编写脚本时会频繁使用标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。
通过内容过滤将输出重定向到文件是我们从事的基础任务之一。
当命令输出文本时,这些输出文本有可能是错误信息,也可能是正常的(非错误的)输出信息。
单靠查看输出的文本本身, 我们无法区分哪些是正常的输出文本,哪些是错误文本。不过,我们可以通过文件描述符来解决这个问题,将那些与特定描述符关联的文本提取出来。
文件描述符是与一个打开的文件或数据流相关联的整数。文件描述符0、1以及2是系统预留的。
0——stdin(标准输入)
1——stdout(标准输出)
2——stderr(标准错误)
1.5.2 实战演练
将输出文本重定向或保存到一个文件中:
这种方法通过截取文件的方式,将输出文本存储到文件temp.txt中,也就是说在把echo命令的输出写入文件之前,temp.txt中的内容首先会被清空。
接下来,再看另一个例子:
$echo "this is sample text 2" >>temp.txt
这种方法会将文本追加到目标文件中。
>和>>并不相同。尽管这两个操作符都可以将文本重定向到文件,但是前者会先清空文件,再写入内容;而后者会将内容追加到现有文件的尾部。
可以用下面的方法查看文件内容:
$cat temp.txt
this is sample text 2
在linux操作系统中,当使用重定向操作符时,重定向的内容不会出现在终端,而是直接被导入文件。重定向操作符默认使用标准输出。如果想使用特定的文件描述符,你必须将描述符置于操作符之前。
>等同于1>;对于>>来说,情况也类似(即>>等同于1>>)。
来看看什么是标准错误以及如何对它重定向。当命令输出错误信息时,stderr信息就会被打印出来。考虑下面的例子:
$ Is +
这里,+是一个非法参数,因些将返回错误信息。
[ 成功和不成功的命令
当一个命令发生错误并退回时,它会返回一个非0的退出状态;而当命令成功完成后,它会返回数字0。退出状态可以从特殊变量$? 中获得(在命令执行语句之后立刻运行echo$?,就可以打印出退出状态)。]
将stderr文本打印到屏幕上,而不是文件中。
$ Is+>out.txt
然而在下面的命令中,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
$ chmod 000 a1 #清除所有权限
尽管可以使用通配符(a*)显示所有的文件内容,但是系统会显示一个出错信息,因为对文件a1没有可读权限。
$ cat a*
a1
a1
其中,cat:a1:permission denied 属于stderr。我们可以将stderr信息重定向到一个文件中,而stdout 仍然保持不变。考虑如下代码:
$ cat a* 2>err.txt #stderr被重定向到err.txt
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
1 a1
2 a1
查看out.txt 的内容:
$ cat out.txt
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
或者我们也可以将/dev/stdin作为输出文件名来使用stdin。
类似的,使用/dev/stderr代表标准错误,/dev/stdout代表标准输出。这些特殊的设备文件分别对应stdin、stderr和stdout。
补充内容:
从stdin读取输入的命令能以多种方式接收数据。另外,还可以用cat和管道来制定我们自己的文件描述符,例如:
$ cat file | cmd
1.将文件重定向到命令
借助重定向,我们可以像使用stdin那样从文件中读取数据:
$ cmd <file
2.重定向脚本内部的文本块
有时候,需要对文本块(多行文本)像标准输入一样进行重定向。考虑一个特殊情况:源文本就位于shell脚本中。
来看下面这段shell脚本吧,向log文件中写入头部数据,可以按照下面的方法完成:
#!/bin/bash
LOG FILE HEADER
This is a test log file
Function:System statistics
EOF
在cat <<EOF>log.txt与下一个EOF行之间的所有文本行都会被当做stdin数据。log.txt文件的内容打印如下:
$ cat log.txt
This is a test log file
Function:System statistics
玩转Linux文件描述符和重定向的更多相关文章
- Linux文件描述符与重定向
文件描述符可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作. 当Linux启动的时候会默认打开三个文件描述符,分别是: 标 ...
- Linux 文件描述符和重定向
200 ? "200px" : this.width)!important;} --> 介绍 文件描述符是与文件输入.输出相关联的整数,在编写脚本时会经常使用标准的文件描述符 ...
- linux文件描述符、软硬连接、输入输出重定向
引用链接:https://blog.csdn.net/qq769651718/article/details/79459346 文件描述符的作用: 文件描述符是linux操作系统中特有的概念.其相当于 ...
- [转帖]linux文件描述符文件/etc/security/limits.conf
linux文件描述符文件/etc/security/limits.conf https://blog.csdn.net/fanren224/article/details/79971359 需要多学习 ...
- linux专题一之文件描述符、重定向、管道符、tee命令
本节讨论一下几个问题: 1. 文件描述符. 2. 重定向. 3. 管道符 4. tee的用法. 1. 文件描述符. 在linux系统中一切皆文件.文件夹和设备都是文件.如何用来区别不同的文件呢?这里的 ...
- 【Linux】文件描述符与重定向
重定向符号 符号 描述 > 输出重定向到一个文件或设备 覆盖原来的文件 >! 输出重定向到一个文件或设备 强制覆盖原来的文件 >> 输出重定向到一个文件或设备 追加原来的文件 ...
- Linux文件描述符
在Linux通用I/O模型中,I/O操作系列函数(系统调用)都是围绕一个叫做文件描述符的整数展开.这不禁让人产生疑问:这个整数代表什么?一个数值代表一个文件吗?随便传一个整数进去调用可以吗? 原文地址 ...
- Linux 文件描述符详解
Overview 了解Linux怎样处理输入和输出是非常重要的.一旦我们了解其原理以后,我们就可以正确熟练地使用脚本把内容输出到正确的位置.同样我们也可以更好地理解输入重定向和输出重定向. Linux ...
- Linux文件描述符与打开文件之间的区别(转载)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为: ...
随机推荐
- 仿LOL项目开发第五天
仿LOL项目开发第五天 by草帽 今天呢,我们看下能开发什么内容,首先上节我们已经讲了UI框架的搭建,上节还遗留下很多问题,比如说消息的字符是代码里面自己赋值的. 那么就比较死板,按照正常的逻辑,那些 ...
- 标准C++类std::string的内存共享和Copy-On-Write技术
标准C++类std::string的 内存共享和Copy-On-Write技术 陈皓 1. 概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是 ...
- http响应报文,如果响应的内容比较大,客户端怎么样判断接收完了呢?
1. http协议有正文大小说明的content-length 2. 或者分块传输chunked的话 读到0\r\n\r\n 就是读完了 ---------------------------- ...
- ReportStudio中创建日期提示默认值模板
很多人已经知道可以通过JS给RS中的日期提示控件设置运行前的默认值---------例如: 日期时间段默认为上一个月的开始日和结束日 在系统所有的报表中都这样操作,我们如何快速的引入?和方便下次修改统 ...
- Sql Server 2005 镜像后收缩日志
网站的一个数据库的日志文件已经到150个G的地步,数据文件才几十M,通过常规的操作去收缩日志: >数据库右键 → 任务 → 收缩 → 文件 , 在弹出的窗口中,文件类型选择"日志&qu ...
- 同步网络时间到linux服务器(先修改时区再进行同步网络时间)
查看时区:date -R 修改整个系统时区: rm -f /etc/localtime ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 网 ...
- Asp.net视图状态的作用
视图状态(view state)是在单个页面中保存信息的第一选择,ASP.NET Web控件也使用试图状态在回发间保存属性值.通过页面内建的 ViewState 属性,你可以把自己的数据放入到视图状态 ...
- VMware - "Determining IP Information for eth0...Failed
Linux ifup eth0 出现错误: Dertermining IP information for eth0....failed - no link present check cable D ...
- Android Studio优秀插件汇总
- react 中使用 lodash 中的 _.throttle
1.场景: 首次调用执行一次,一定时间内再次调用,不再执行. 2.实现 debounce (函数去抖) 多次触发,只在最后一次触发时,执行目标函数. _.debounce(func, [wait=0] ...