IO重定向
http://tldp.org/LDP/abs/html/io-redirection.html
http://mp.weixin.qq.com/s/JMHDutEG4R0hEaXrYPmCGg
每个打开的文件都会被分配一个文件描述符。stdin、stdout 和 stderr 的文件描述符分别是 0、1 和 2。除了这 3 个文件,对于其它那些需要打开的文件,保留了文件描述符 3 到 9。-- Mendel Cooper
本文导航
-重定向16%
-> file16%
->> file27%
-&> file34%
-m> file36%
-m>&n40%
-< file47%
-j<>file52%
-管道60%
-关闭文件描述符79%
编译自: http://tldp.org/LDP/abs/html/io-redirection.html
作者: Mendel Cooper
译者: 佚名
一个文件描述符说白了就是文件系统为了跟踪这个打开的文件而分配给它的一个数字,也可以的将其理解为文件指针的一个简单版本,与C语言中文件句柄的概念很相似。
Linux 中默认情况下始终有 3 个“文件”处于打开状态,stdin(键盘)、 stdout(屏幕)和 stderr(错误消息输出到屏幕上)。这 3 个文件和其他打开的文件都可以被重定向。重定向,简单的说就是捕捉一个文件、命令、程序、脚本,或者是脚本中的代码块的输出,然后将这些输出作为输入发送到另一个文件、命令、程序或脚本中。
每个打开的文件都会被分配一个文件描述符。stdin、stdout 和 stderr 的文件描述符分别是 0、1 和 2。除了这 3 个文件,对于其它那些需要打开的文件,保留了文件描述符 3 到 9。在某些情况下,将这些额外的文件描述符分配给 stdin、stdout 或 stderr 作为临时的副本链接是非常有用的。在经过复杂的重定向和刷新之后需要把它们恢复成正常状态。
重定向
> file
将 stdout 重定向到一个文件。如果这个文件不存在,那就创建,否则就覆盖。
创建一个包含目录树列表的文件:
ls -lR >dir-tree.list
清空文件:
: > file
这是一个 >
操作,将会把文件 file 变为一个空文件(就是 size 为 0)。如果文件不存在,那么就创建一个 0 长度的文件(与touch
的效果相同)。:
是一个占位符,不产生任何输出。
也可以省略 :
占位符:
> file
与上边的 : >
效果相同, 但是某些 shell (比如 bash)可能不支持这种形式。
>> file
将 stdout 重定向到一个文件。如果文件不存在,那么就创建它,如果存在,那么就追加到文件后边。
script.sh 1 > filename
# 重定向 stdout 到文件"filename".
script.sh 1 >> filename
# 重定向并追加 stdout 到文件"filename".
script.sh 2 > filename
# 重定向 stderr 到文件"filename".
script.sh 2 >> filename
# 重定向并追加 stderr 到文件"filename".
&> file
将 stdout 和 stderr 都重定向到文件:
script.sh &> /dev/null
m> file
m 是一个文件描述符,如果没有明确指定的话默认为 1。
file 是一个文件名。文件描述符 m 被重定向到文件 file。
script.sh 2> error.log
m>&n
m 是一个文件描述符,如果没有明确指定的话默认为 1。
n 是另一个文件描述符。
script.sh 2>&1
重定向 stderr 到 stdout。将错误消息的输出,发送到与标准输出所指向的地方。
exec 6<>File
script.sh >&6
默认的,重定向文件描述符 1(stdout)到 6。所有传递到 stdout 的输出都送到 6 中去。
< file
从文件中接受输入。与 >
是成对命令,并且通常都是结合使用。0 < file
或 < file
,前面的标准输入 stdin 0 可以省略。
grep search-word < filename
j<>file
为了读写 file,把文件 file 打开,并且将文件描述符 j 分配给它。
如果文件 file 不存在,那么就创建它。如果文件描述符 j 没指定,那默认是标准输入 stdin 0 。
echo 1234567890 > File ### 写字符串到 File .
exec 3<>File ### 打开 File 并且将 fd 3 分配给它.
read -n 4 <&3 ### 只读取4个字符.
echo -n . >&3 ### 写一个小数点.
exec 3>&- ### 关闭fd 3.
cat File ### ==> 1234.67890
(注:上述命令的输出结果和原文不同,原因未知。)
管道
管道与 >
很相似,但是实际上更通用。对于想将命令、脚本、文件和程序串连起来的时候很有用。
cat *.txt | sort | uniq > result-file
上述命令对所有 .txt 文件的输出进行排序,并且删除重复行。最后将结果保存到 result-file 中。
可以将输入输出重定向和/或管道的多个实例结合到一起写在同一行上:
command < input-file > output-file
等价于:
< input-file command > output-file
但是这种写法不标准,有的 shell 可能不支持。
可以将多个输出流重定向到一个文件上:
ls -yz >> command.log 2>&1
将错误选项 yz 的结果放到文件 command.log 中。因为 stderr 被重定向到这个文件中,所以所有的错误消息也就都指向那里了。
注意,下边这个例子就不会给出相同的结果:
ls -yz 2>&1 >> command.log
输出一个错误消息,但是并不写到文件中。命令的输出(如果有的话)写入到文件 command.log。
如果同时将 stdout 和 stderr 都重定向,命令的顺序不同会带来不同的结果。
关闭文件描述符
n<&- 关闭输入文件描述符 n。
0<&- 或 <&- 关闭 stdin。
n>&- 关闭输出文件描述符 n。
1>&- 或 >&- 关闭 stdout。
子进程继承了打开的文件描述符。这就是为什么管道可以工作的原因。如果想阻止文件描述符被继承,那么可以关掉它。
只将 stderr 重定到一个管道。
exec 3>&1 ### 保存当前 stdout 的"值"(将 fd3 指向 fd0 相同目标)
ls -l 2>&1 >&3 3>&- | grep bad 3>&- ### 对'grep'关闭 fd 3
### ^^^^ ^^^^ ###(但不关闭'ls',正常输出内容不受grep影响)
ls -l 2>&1 >&3 | grep bad ### 这样输出内容被转到了 fd3,也不会受 grep 影响
ls badabc -l 2>&1 >&3 |grep bad ### stderr 通过 fd1 输出,会受 grep 影响
exec 3>&- ### 对于剩余的脚本来说,关闭它
使用文件描述符 5 可能会引起问题。当 Bash 使用 exec 创建一个子进程的时候,子进程会继承文件描述符 5 (参考 Chet Ramey 的归档 e-mail: RE: File descriptor 5 is held open[1])。 最好还是不要去招惹这个特定的文件描述符 5
IO重定向的更多相关文章
- [C++]竞赛模板·数据统计与IO(重定向版与非重定向版)
/* 数据统计与IO 重定向版模板 描述:本机测试用文件数据流重定向,一旦提交到比赛就自动“删除”重定向语句 */ # define LOCAL #include<stdio.h> # ...
- Bash : IO 重定向
标准输入/输出(standard I/O)可能是软件设计原则里最重要的概念了.这个概念就是:程序应该有数据的来源端.数据的目的端(输出结果的地方)已经报告问题的地方,它们分别被称为标准输入(stand ...
- linux学习14 Linux运维高级系统应用-glob通配及IO重定向
一.回顾 1.bash基础特性:命令补全,路径补全,命令引用 2.文件或目录的复制,移动及删除操作 3.变量:变量类型 存储格式,数据表示范围,参与运算 二.bash的基础特性 1.globbing: ...
- 四、IO重定向和管道以及基本文本处理工具
一.三种IO设备 程序:数据+指令 或 数据结构+算法程序必须能够读入输入然后经过加工来产生结果,其接受的输入可以是变量.数组.列表.文件等等,生产出来的结果可以使变量.数组.列表.文件等等.即:程序 ...
- IO重定向与管道
一.三种IO设备 程序:数据+指令 或 数据结构+算法 程序必须能够读入输入然后经过加工来产生结果,其接受的输入可以是变量.数组.列表.文件等等,生产出来的结果可以使变量.数组.列表.文件等等.即: ...
- shell IO重定向
I/O重定向 默认情况下,有3个"文件"处于打开状态,stdin,stdout,stderr:重定向的解释:捕捉一个文件,命令,程序,脚本或者脚本中的代码块的输出,然后将这些输出作 ...
- <实训|第十一天>学习一下linux中的进程,文件查找,文件压缩与IO重定向
[root@localhost~]#序言 在今后的工作中,运维工程师每天的例行事务就是使用free -m,top,uptime,df -h...每天都要检查一下服务器,看看是否出现异常.那么今天我们就 ...
- Perl IO:IO重定向
文件句柄和文件描述符的关系 文件描述符是操作系统的资源,对于实体文件来说,每打开一次文件,操作系统都会为该进程分配一个文件描述符来关联(指向)这个文件,以后操作文件数据都根据这个文件描述符来操作,而不 ...
- Linux IO重定向和管道
计算机组成部分: 由io . 控制器.计算器.存储器组成 IO: input output 计算机里面通过终端窗口实现输入和输出,键盘鼠标屏幕这些只是手段,真正完成输入输出的是终端窗口 标准输入.出. ...
- 4-3 管理及IO重定向
1. 系统设定默认输出设备:标准输出(STDOUT,1) 系统设定默认输入设备:标准输入(STDIN,0) 系统设定默认错误设备:标准错误(STDERR,2) 2. 标准输入:键盘 标准输出和错误输出 ...
随机推荐
- HTML5 FormData 模拟表单控件 支持异步上传二进制文件 移动端
FormData是XMLHttpRequest Level 2添加的一个新的接口,利用FormData对象,我们可以通过JavaScript用一些键值对来模拟一系列表单控件,还可以使用XMLHttpR ...
- 【Java_基础】Java中Native关键字的作用
本篇博文转载与:Java中Native关键字的作用
- GIMP里的Path移动,旋转,翻转操作
1/Path的移动: 快捷键Ctrl+Move Tool 2/Path的旋转: 选择Rotate Tool,在Path中选择,出现十字圈. Angel下的滑块调节一定的角度,在合适的位置即可. 3/P ...
- 常用c++函数
strrev(str) (str为字符串)倒序输出字符串 floor(x),有时候也写做Floor(x),其功能是“向下取整”,或者说“向下舍入”,即取不大于x的最大整数(与“四舍五入”不同,下取整 ...
- django第五天(虚拟环境安装和视图层相关)
django第5天 虚拟环境安装 ''' 1.通过pip3安装虚拟环境: -- pip3 install virtualenv 2.前往目标文件夹: -- cd 目标文件夹 (C:\Virtualen ...
- [转]automaticallyAdjustsScrollViewInsets(个人认为iOS7中略坑爹的属性)
@当我们在一个UIViewController中同时创建2个tableView的时候,如果把它们的frame中的Y坐标设置为一样,你可能会发现它们的位置并没有达到你想要的结果.比如第一tableVie ...
- Spring,Mybatis,Springmvc框架整合项目(第三部分)
一.静态资源不拦截 第二部分最后显示的几个页面其实都加载了css和js等文件,要不然不会显示的那么好看(假装好看吧),前面已经说了,我们在web.xml中配置了url的拦截形式是/,那么Dispatc ...
- Developing
To work with the Android code, you will need to use both Git and Repo. In most situations, you can u ...
- python之动态参数 *args,**kwargs(聚合,打散)
一.函数的动态参数 *args,**kwargs, 形参的顺序1.你的函数,为了拓展,对于传入的实参数量应该是不固定,所以就需要用到万能参数,动态参数,*args, **kwargs 1,*args ...
- 15,re正则表达式
判断手机号是否合法. phone_number = input('请输入手机号:') if re.match('^(13|14|15|18)[0-9]{9}$',phone_number): prin ...