【linux】linux的数据流重定向
首先说一下什么是数据流重定向,所谓数据流重定向简单来说就是一个过程,这个过程捕捉一个文件,或者命令,程序,脚本,甚至脚本中的代码块(code block)的输出,然后把捕捉到的输出,作为输入发送给另外一个文件,命令,程序,或者脚本。
谈到数据流重定向,我们首先需要了解文件描述符的概念。对于linux内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程等返回一个文件描述符。按照惯例,unix系统shell把文件描述符0与进程的标准输入关联,文件描述符1与标准输出关联,文件描述符2与标准错误关联。总结如下:
标准输入:文件描述符0,通常指键盘的输入 。使用符号<或<<
标准输出:文件描述符1,通常指命令执行所回传的正确信息 ,默认输出到屏幕u。使用符号>或>>
标准错误:文件描述符2,通常指命令执行失败后,所回传的信息,也是默认输出到屏幕。试用符号2>或2>>
默认情况下>和>>分别表示1>或1>>,<和<<与0<和0<<等价。
标准输出重定向:
#ls
表示列出当前目录条目,并将结果输出到屏幕。
#ls 1>file1
以上命令会把命令的标准输出重新定向到一个文件file,而不是显示到屏幕上,如果不指明文件标识符,系统默认的就是1, 因此1可以省略。
即这个命令等同于
#ls >file1
如果file1不存在,则系统会自动创建。如果已经存在,那么系统首先会把这个文件清空,然后再将数据写入该文件。也就是说>输出到一个已存在的文件,那么会覆盖这个文件。如果不想覆盖,可以使用>>。表示将重定向数据追加到file1文件的末尾。
标准错误重定向:
#ls -qw 2>errorfile
表示将错误信息不输出到屏幕,而是写入errorfile。注意这里的2不能省略。因为>与1>等同,默认是标准输出重定向。所以这里要写成2>,表示标准错误重定向。-qw用来产生错误信息。
把标准错误和标准输出写入同一个文件:
#./a.out &>outfile
这个命令把./a.out的标准输出和标准错误重定向到outfile。&在这里表示标准错误和标准输出。下面是另一种写法:
#./a.out > outfile 2>&1
下面是一个错误的例子:
#./a.out > outfile 2>outfile
标准输入重定向:
#grep search-world <filename 或 grep search-world 0<filename
还有下面这种方式:
cat > catfile < ~/.bashrc
它代表将~/.bashrc的内容作为输入,然后将这些内容写入catfile
关闭文件:
"&-"表示关闭文件标识符
有关关闭文件标识符的操作请参考下面
n<&- 关闭输入文件标识符n
0<&-或<&- 关闭标准输入stdin
n>&- 关闭输出文件标识符n
1>&-或>&-关闭标准输出stdout
屏蔽标准输出或标准错误:
./a.out > /dev/null #等同于./a.out 1>dev/null 表示屏蔽标准输出
./a.out 2>/dev/null #表示屏蔽标准错误
./a.out > /dev/null 2>/dev/null #表示同时屏蔽标准输出和标准错误
打开文件:
#exec 3<>filename 把文件filename打开,并指定文件标识符为3
命令j<>filename表示把文件打开,并指明文件标识符为j
我们什么时候需要重定向:
1.屏幕输出的信息很重要,而且我们需要将它存下来的时候。
2. 后台执行中的程序,不希望它干扰屏幕正常的输出结果时。
3. 一些系统的例行命令。(例如写在/etc/crontab中的文件)的执行结果时,希望它可以存下来。
4. 一些执行命令的可能已知错误信息时,想以“2>dev/null"将它丢掉
5. 错误信息与正确信息需要分别输出时
常用重定向命令:
cmd > file 把 stdout 重定向到 file 文件中;
cmd >> file 把 stdout 重定向到 file 文件中(追加);
cmd 1> fiel 把 stdout 重定向到 file 文件中;
cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中;
cmd 2> file 把 stderr 重定向到 file 文件中;
cmd 2>> file 把 stderr 重定向到 file 文件中(追加);
cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file 文件中(追加);
cmd < file >file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout;
cat <>file 以读写的方式打开 file;
cmd < file cmd 命令以 file 文件作为 stdin;
cmd << delimiter Here document,从 stdin 中读入,直至遇到 delimiter 分界符。
>&n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出;
<&n 标准输入复制自文件描述符 n;
<&- 关闭标准输入(键盘);
>&- 关闭标准输出;
n<&- 表示将 n 号输入关闭;
n>&- 表示将 n 号输出关闭;
与重定向相关的题目:
此题来自《unix环境高级编程》(第3版)P73 3.5
在Bourne shell、Bourne-again shell 和Korn shell中,digit1>&digit2表示将描述符digit1的重定向至描述符digit2的同一文件。请说明下面两条命令的区别。
./a.out > outfile 2>&1
./a.out 2>&1 >outfile
答:因为shell从左到右处理命令行,所以:
./a.out > outfile 2>&1 等同于./a.out 1>outfile 2>&1
首先执行 >outfile 设置标准输出到outfile,然后执行2>&1,即调用dup将标准输出复制到描述符2(标准错误上),其结果是将标准输出和标准错误设置为同一个文件,即描述符1和2指向同一个文件表项。而对于命令行
./a.out 2>&1 >outfile
首先执行dup,所以描述符2成为终端(假设命令是交互执行的),标准输出重定向到outfile。结果是描述符1指向outfile的文件表项,描述符2指向终端的文件表项。
参考资料:
1.http://os.51cto.com/art/201003/187688.htm
2.http://blog.csdn.net/ljianhui/article/details/9262737
3.https://www.ibm.com/developerworks/cn/linux/l-iotips/
4.《unix环境高级编程》
命令j<>filename表示把文件打开,并指明文件标识符为j
【linux】linux的数据流重定向的更多相关文章
- (大数据工程师学习路径)第一步 Linux 基础入门----数据流重定向
介绍 开始对重定向这个概念感到些许陌生,但通过前面的课程中多次见过>或>>操作了,并知道他们分别是将标准输出导向一个文件或追加到一个文件中.这其实就是重定向,将原本输出到标准输出的数 ...
- 谈谈Linux下的数据流重定向和管道命令
一.标准输入.标准输出.错误输出概述 1.标准输入(stdin)是指令数据的输入,代码为0,使用<或者<<,默认是键盘. 2.标准输出(stdout)是指令执行成功返回的结果,代码为 ...
- Linux 数据流重定向
1.三种数据流重定向1)标准输入(stdin):代码为0,使用0<或0<<,其中代码0可以省略2)标准输出(stdout):代码为1,使用1>或1>>,其中代码1可 ...
- 十句话教你学会Linux数据流重定向
1.看到重定向一下子就想起了web里面的redirect,没错,但是Linux数据流重定向的作用不是跳到另一个网页,而是用来存储重要的屏幕信息.将不必要的屏幕信息输出到文件里或者“黑洞”里.将错误信息 ...
- 初窥Linux 之 数据流重定向
一.什么是数据流重定向 在说数据流重定向之前,先来说说数据流的概念吧.数据流分为三种:标准输入(stdin),标准输出(stdout)和标准错误输出(stderr). 简单来说,标准输出指的是命令执行 ...
- linux(4) vi编辑/删除、复制、粘贴 /bash shell 环境变量设置/数据流重定向 | 的用法
一.vi文字处理器1.vi与vimvi:文字处理器vim:程序开发工具2.vi介绍三种模式:一般模式(vi刚进入的,不可编辑),编辑模式(按i后,左下方是insert)和命令行模式(按esc退出,:w ...
- Linux数据流重定向与管道
数据流重定向简单来说就是把原本应该输出到某处(比如说屏幕)的数据,重定向其输出目的地,到其他的地方(比如文件). linux中的输入与输出: 标准输入(stdin):默认从键盘输入 标准输出(stdo ...
- 【Linux】数据流重定向
数据流重定向(redirect)就是将某个命令执行后应该要出现在屏幕上的数据,给它传输到其他的地方,例如文件或设备(打印机之类的).这玩意在Linux的命令行模式下很重要,尤其是想要将某些数据存储下来 ...
- linux——(8)数据流重定向、管道命令
概念一:数据流重定向 数据流分输入流和输出流,还有一个标准错误流,负责管理出错信息,比如一般的命令的输出会输出到屏幕上,我们可以用重定向让他输入到某个文件内. 相关操作: 1,标准输入(stdin): ...
随机推荐
- HyperLedger Fabric 1.4 区块链技术原理(2.2)
区块链从字面上理解:数据记录在区块中,通过一定的算法把区块连成一个链. 区块链通过哈希(Hash)算法,生成一串字符串,保存在区块的头部中,一个的区块通过指向上一个Hash值,加入到区块链 ...
- 20155204 2016-2017-2 《Java程序设计》第3周学习总结
20155204 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 一个原始码中可以有多个类定义,但只能有一个公开类. 留心Scanner对于每一种类型的nex ...
- 20155220 2016-2017-2《Java程序设计》课程总结
20155220 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:师生关系 预备作业2:优秀技能经验 预备作业3:虚拟机linux初接触 第一周学习总结: ...
- 20155227 2016-2017-2 《Java程序设计》第十周学习总结
20155227 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 Java的网络编程 网络编程 就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所 ...
- 20155310 2016-2017-2 《Java程序设计》第2周学习总结
20155310 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 •布尔:boolean类型可表示true和false. •浮点数:主要用来储存小数数值,细分 ...
- Spring之HandlerInterceptor拦截器
思维导图下载:https://pan.baidu.com/s/19z73Bs8MsHFAupga3Cr3Gg
- 【BZOJ3489】A simple rmq problem
[BZOJ3489]A simple rmq problem 题面 bzoj 题解 这个题不强制在线的话随便做啊... 考虑强制在线时怎么搞 预处理出一个位置上一个出现的相同数的位置\(pre\)与下 ...
- 【NOIP2018pj】题解
[NOIP2018pj]题解 \(T1\) 题面 洛谷 题解 好像并没有什么好说的... #include <iostream> #include <cstdio> #incl ...
- 如何在存储过程的IN操作中传递字符串变量
原始SQL如下: SELECT MONTH(OrderTime) AS datetype, SUM(DeliveryCount) AS decount, Region FROM (SELECT dbo ...
- C#之#if #endif的简单用法
有时候我们看到别人的代码中有#if #endif,其实这是通过不同版本来选择运行哪段代码,和咱们的if,else是一样的.下面看下简单的用法 #if DEBUG txt_display.Text = ...