【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): ...
随机推荐
- js点击后将文字复制到剪贴板,将图片复制到画图
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML> <HEAD& ...
- 20155207 2016-2017-2 《Java程序设计》第十周学习总结
20155207 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据. 狭义的网络编程范畴 ...
- 树链剖分学习&BZOJ1036
题目传送门 树链剖分,计算机术语,指一种对树进行划分的算法,它先通过轻重边剖分将树分为多条链,保证每个点属于且只属于一条链,然后再通过数据结构(树状数组.SBT.SPLAY.线段树等)来维护每一条链. ...
- 【转载】C/C++杂记:深入虚表结构
原文:C/C++杂记:深入虚表结构 1. 虚表与“虚函数表” 在“C/C++杂记:虚函数的实现的基本原理”一文中曾提到“虚函数表”的概念,只是为了便于理解,事实是:虚函数表并不真的独立存在,它只是虚表 ...
- 【LG4309】【BZOJ3173】[TJOI2013]最长上升子序列
[LG4309][BZOJ3173][TJOI2013]最长上升子序列 题面 洛谷 BZOJ 题解 插入操作显然用平衡树就行了 然后因为后面的插入对前面的操作无影响 就直接在插入完的序列上用树状数组求 ...
- Redis可视化客户端管理Web UI工具收集
https://github.com/uglide/RedisDesktopManager(推荐,全平台支持的桌面UI工具) Web方案: https://github.com/ErikDubbelb ...
- Python接口测试实战3(下)- unittest测试框架
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...
- 用gdb调试程序(Linux环境)
一般来说,GDB主要帮忙你完成下面四个方面的功能: 1.启动你的程序,可以按照你的自定义的要求随心所欲的运行程序. 2.可让被调试的程序在你所指定的调置的断点处停住.(断点可以是条件表达式) ...
- xampp服务器搭建和使用
1.安装完XAMPP后会出现Apache端口被占用的问题,一下方法解决 错误信息如下: Error: Apache shutdown unexpectedly. 9:37:01 [Apache] T ...
- redis主从配置+sentinel哨兵
redis主从配置+sentinel哨兵 1:编译环境准备 1.1环境确认 Redis是一个开源.支持网络.基于内存.键值对存储数据库,使用ANSI C编写.所以在搭建Redis服务器时需要C语言的编 ...