本文的例子部分是引用网络上的一篇文章。

Linux的IO输入输出有三类

Standard Input 代码 0

Standard Output 代码 1

Standard Error 代码 2

举个例子:ls test.sh test1.sh >success.txt 2>&1

将前面执行结果的标准输出流写入success.txt文件,省略了1,全句为:ls
test
.sh test1.sh 1>success.txt
2>&1

错误输出用2,如2>error.txt。用&1表示类似1,和1绑定到一起,输出到一个文件,用&表示绑定在一起。而“&-”表示关闭。

但注意,

command > file 2>file 与command
> file 2>&1 是不同的:

command > file 2>file :是将命令所产生的标准输出信息stdout和错误的输出信息stderr送到file中,但这样会导致file会被打开两次,所以stdout和stderr会互相覆盖。实际上FD1和FD2同时使用file,引起资源竞争。
command >file 2>&1:将stdout直接送向file,而stderr是继承FD1管道后被送往file,所以file 只被打开一次,stdout和stderr共用FD1一个管道。实际相当于stderr合并到stdout后一起输出到file中。
从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,较多的时候我们会用command > file 2>&1 这样的写法.

1. 标准输入,标准输出与标准错误输出

标准输入:从键盘输入,即从键盘读入数据。

标准输出:把数据输出到终端上。

标准错误输出:把标准错误输出到终端上。

默认的标准输入指的是键盘,默认的标准输出与标准错误输出是屏幕或者是终端。

系统为这三个文件分配了文件标识符fd(file descripter).分别为0,1,2.

在Linux系统下,一切皆是文件,对文件的操作,一般要用到文件标识符。

2. 重定向

重定向分为输入重定向与输出重定向。

"<"表示输入重定向

">"表示输出重定向

所谓的输入重定向即输入不从键盘读入,而是从文件输入或其它。

所谓的输出重定向即不输出到终端上,而是输出到文件中去或其它。

"<<"代表当前标准输入来自命令行的一对分隔号的中间内容。

用">"输出时,如果文件不存在会自动建立一个文件,如果第二次输入时,会覆盖前一次的输入内容,

而">>"输出,表示追加到文件中,不覆盖。当前输出内容会追加到指定文件的尾部。

如:

python historical_report.py 2014 06 age | >log_sex_age.txt 2>&1

python historical_report.py 2014 06 age | >>log_sex_age.txt 2>&1

这里注意“|”两边的空格可有可无。>会覆盖原文件,>>只追加到文件尾。

3. 下面看一下几个例子

(1)输入重定向

[root@localhost ~]# wc</etc/inittab

53 229 1666

wc统计行数,单词数, 字符数

其中wc的输入来自 /etc/inittab

[root@localhost ~]# wc <<aa

> 1

> 11

> 111

> aa

3 3 9

wc统计分隔符aa之间的内容。

(2)输出重定向

[root@localhost ~]# ps -ef >a.txt //把进程的信息输出重定向到a.txt文件中去

[root@localhost ~]# ps -ef> >a.txt //进程信息追加到a.txt的文件中去

其实,所谓的输入输出重定向就是不从键盘输入和屏输出。

4. Linux下输出重定向的典型分析

(1) a.out > outfile 2>&1

(2) a.out 2> &1 >outfile

分析:

0代表标准输入,1代表标准输出,2代表标准错误输出。其中1(即>=1>)可省略,默认为标准输出。所以输出一般省略1,如cat "test" 1>log 2>eorr ,简写成,cat "test" >log 2>eorr。

(1)首先把a.out重定向到outfile中。然后 2>&1把标准错误输出重定向和1一样的文件中去。相当于把标准输出与标准错误输出都一起重定向到outfile中去。 &1代表的是标准输出的文件描述符。1一般放在左边表示标准输出重定向到什么位置,而1放在右边是重定向到标准输出中,所以用&区分一下,表示标准输出的文件描述符。2>1表示把标准错误重定向到文件1中去,2>&1则表示标准错误重定向到标准输出中去。

(2)首先把标准错误输出重定向到标准输出中,此时标准输出还在终端。因此标准错误也在终端。然后标准输出到outfile中去了。而标准错误还是在终端。

因此,(1)表示标准输出与标准错误都到outfile中去了。

(2)表示标准输出到outfile,但标准错误输出仍然在终端。

ls 1>/dev/null 2>/dev/null

ls >/dev/null 2>&1

/dev/null是一个垃圾箱,是一个无底洞,表示的含义为不显示。

即标准输出与标准错误输出不显示。

以上两个命令表示的含义是相同的。

另外,&>表示全部重定向:ls thereisno &> out.txt 所有IO重定向(&>中的&可以代表任意,0,1,2,3……)

一篇写的非常好的

http://blog.chinaunix.net/uid-9525959-id-3267166.html

shell重定向(大于号,小于号,左右,2>&1,&)的更多相关文章

  1. ibatis mybatis sql语句配置 符号不兼容 大于号 小于号<!CDATA[ ]>

    ibatis mybatis sql语句配置 符号不兼容 大于号 小于号<!CDATA[ ]> 因为这个是xml格式的,所以不允许出现类似">"这样的字符,但是都 ...

  2. 【Mybatis】【2】处理大于号小于号及其他特殊字符

    正文: 问题:用<的时候会报错.因为是xml文件,会被识别成标签 解决方法: 原sql:SELECT * FROM TABLE T WHERE T.AGE < 10; 1,转义字符.用转义 ...

  3. mybatis使用时遇到的一些问题------模糊查询、处理大于号小于号、相关函数替换空值

    在mybatis中可能会用到的方法 1.模糊查询 <select id="showByIdName" parameterType="User" resul ...

  4. 转!!mybatis在xml文件中处理大于号小于号的方法

    第一种方法: 用了转义字符把>和<替换掉,然后就没有问题了. SELECT * FROM test WHERE 1 = 1 AND start_date  <= CURRENT_DA ...

  5. Mybatis在xml文件中处理大于号小于号的方法

    第一种方法:用了转义字符把">"和"<"替换掉,然后就没有问题了. AND start_date <= CURRENT_DATE AND en ...

  6. java mybatis XML文件中大于号小于号转义

    因为这个是xml文件不允许出现类似“>”这样的字符 用了转义字符把>和<替换掉,然后就没有问题了. <=   相当于 <= >=  相当于 >= XML转义字 ...

  7. 【转】mybatis在xml文件中处理大于号小于号的方法

    http://blog.csdn.net/zheng0518/article/details/10449549 第一种方法: 用了转义字符把>和<替换掉,然后就没有问题了. SELECT ...

  8. MyBatis SQL处理大于、小于号

    MyBatis mapper文件是xml文件,需要特殊字符如大于号.小于号后需要转义. 原字符 转义后字符 < < <= <= > > > >=

  9. java mybatis XML文件中大于号小于号转义(转载)

    因为这个是xml文件不允许出现类似“>”这样的字符 用了转义字符把>和<替换掉,然后就没有问题了. XML转义字符 字段 符号 说明 &lt ; < 小于号 & ...

  10. 【Mybatis】 Mybatis在xml文件中处理大于号小于号的方法【问题】

    处理大于小于号的方法: https://www.cnblogs.com/winner-0715/p/6132755.html 第一种方法:用转义字符把">"和"&l ...

随机推荐

  1. ThreadLocal(线程绑定)

    为保证在DAO层里的操作都在同一事务里,我们曾使用以参数的形式将Connection向下传递的方式,而ThreadLocal来创建Connection连接,避免了一直以参数的形式将Connection ...

  2. Bootstrap3 栅格系统-实例:流式布局容器

    如何让小屏幕设备上所有列不堆叠在一起,使用针对超小屏幕和中等屏幕设备所定义的类就可以做到,即 .col-xs-* 和 .col-md-*.举例: <!-- Stack the columns o ...

  3. 20160218.CCPP体系详解(0028天)

    程序片段(01):加法.c 内容概要:字符串计算表达式 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <st ...

  4. ICL Auto Vectorization

    简介 此文简单介绍如何使用intel c++编译器实现向量化加速. 全文如下安排: base : 待优化的源代码. vectorization : 第一个向量化版本. aligned : 内存对其对向 ...

  5. PHP学习(1)——我为什么要学PHP

    PHP简介 PHP是一种服务器端的脚本语言,特别适合做web开发.高效.灵活.实用是PHP的特点.PHP最开始是Personal Home Page的缩写,后来正式更名为了"PHP:Hype ...

  6. AsnycTask的内部的实现机制

    AsnycTask的内部的实现机制 写在前面 我们为什么要用AsnycTask. 在Android程序开始运行的时候会单独启动一个进程,默认情况下所有 这个程序操作都在这个进程中进行.一个Androi ...

  7. Scikit-learn:scikit-learn快速教程及实例

    http://blog.csdn.net/pipisorry/article/details/52251305 :7] y = dataset[:,8] 我们将在下面所有的例子里使用这个数据组,换言之 ...

  8. 【移动开发】 Android隐藏输入法软键盘的一些说明

    刚刚在写一个仿微信的Android聊天软件,在编写的过程中,发现一个严重的BUG---当用户点击输入框用软键盘输入文本的时候点击了"返回好友列表"的按钮,返回到好友列表时软键盘无法 ...

  9. Dynamics CRM 非声明验证方式下连接组织服务的两种方式的性能测试

    今天看了勇哥的博文"http://luoyong0201.blog.163.com/blog/static/1129305201510153391392/",又认识到了一种新的连接 ...

  10. Python模块探秘 Smtplib发送带有各种附件的邮件

    这两天对Python的邮件模块比较感兴趣,于是就查了查资料.同时在实际的编码过程中也遇到了各种各样的问题.下面我就来分享一下我与smtplib的故事. 前提条件 我的上一篇博文里面讲解了,发送邮件必须 ...