博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shell重定向(大于号,小于号,左右,2>&1,&)
阅读量:3785 次
发布时间:2019-05-22

本文共 3125 字,大约阅读时间需要 10 分钟。

shell重定向(大于号,小于号,左右,2>&1,&)
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……)
区别:command >/dev/null 2>&1 与command  2>&1 >/dev/null
前者先将标准输出输出到/dev/null中,再将错误输出重定向到标准输出,所以都输出到/dev/null
后者先将错误输出重定向到标准输出也就是输出到屏幕上,再将标准输出到/dev/null,只是把原来的标准输出输出到/de/null中,错误输出重定向到标准输出会显示在屏幕上;

标准输出与错误输出同时输出:command  2>file 1>file 会因抢占file文件的管道二出现乱码/确实/覆盖等现象(即两个输出流操作一个文件的写入),所以要用2>&1 进行重定向到一个输出流才可以全部输出到一个文件

备注:&> 与 >的测试结果

下面是实际在linux命令行的测试结果:

[root@Dev_yang shellScript]# lll
-bash: lll: command not found   //由于Linux没有lll这个命令所以会显示错误信息,这个就是stderr输出的错误信息
[root@Dev_yang shellScript]# lll>test
-bash: lll: command not found  //由于这个是错误信息  所以不能使用标准输出>将信息重定向到test文件中,所以错误信息直接在控制台打印出来了
[root@Dev_yang shellScript]# lll&>test  //使用&>重定向 错误信息没有输出到控制台了,表示错误信息正确重定向到了test文件
[root@Dev_yang shellScript]# cat test
-bash: lll: command not found  //通过cat命令确实看到了  保存的错误信息

文章转载自:https://www.cnblogs.com/atwanli/articles/5249542.html

你可能感兴趣的文章
计算几何之 判断两线段是否相交 代码模板与证明
查看>>
三维计算几何之三维凸包 增量法
查看>>
MySQL变量,存储过程,函数,流程控制详解(小白都能懂哦)
查看>>
9篇小白都能懂系列博客学完MySQL基础
查看>>
还在为Linux入门发愁?
查看>>
如何优雅而又不失内涵的在centos7下安装tree命令
查看>>
彻底掌握Linux文件与目录管理命令?进来看看硬核总结
查看>>
一文搞定Vim/Vi编辑器
查看>>
剑指offer之斐波那契问题(C++/Java双重实现)
查看>>
Linux网络命令
查看>>
一天教会三岁表弟HTML,你值得拥有
查看>>
CSS基础汇总
查看>>
SpringCloud服务注册与发现
查看>>
SpringCloud Stream 消息驱动
查看>>
SpringCloud Sleuth 分布式请求链路
查看>>
SpringCloud Alibaba Nacos 服务注册和配置中心
查看>>
poi读写Excel
查看>>
使用Security安全框架实现权限登录
查看>>
JDBC工具类 使用Durid连接池链接MySQL数据库
查看>>
ANSYS——模态提取方法简介
查看>>