诗和远方

shell 重定向 1> 2> &>及/dev/null

shell 脚本中经常会看到 >/dev/null 与>/dev/null 2>&1

shell 重定向

/dev/null 代表空设备文件; > 代表重定向。(<也是文件重定向符,表示输入)

如果命令的输出不想要即想丢弃输出的内容,既不想在标准输出与不想重定向到某个文件,就可将命令的输出重定向到/dev/null。这样做的好处是不会因为输出的内容过多而导致文件大小不断的增加。


command >/dev/null 与 command >/dev/null 2>&1

command >/dev/null的作用是将是command命令的标准输出丢弃,而标准错误输出还是在屏幕上。

可以用command >/dev/null 2>&1 这样标准输出与标准错误输出都会被丢弃。1表示标准输出,2表示标准错误输出,2>&1表示2(错误输出)的输出重定向等同于1(标准输出)。(&表示等同于的意思)


1 > /dev/null 2>&1

1 > /dev/null:首先表示标准输出重定向到空设备文件

2>&1:接着,标准错误输出重定向(等同于)标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。


命令 > 文件 (>即1>)

错误命令 2> 文件(2和>之间没有空格,要紧连在一起)


正确输出和错误输出同时保存的三种命令格式:(以ls命令举例)

ls > filename 2>&1
ls &> filename
ls >> filename  2>>filename2 #正确输出保存在文件filename,错误输出保存在文件filename2


cmd >a 2>a 和 cmd >a 2>&1 为什么不同?

cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。

cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD1的管道之后,再被送往文件a 。a文件只被打开一遍,就是FD1将其打开。

两者的不同点在于:

cmd >a 2>a 相当于使用了FD1、FD2两个互相竞争使用文件 a 的管道【不推荐】;

cmd >a 2>&1 只使用了一个管道FD1,但已经包括了stdout和stderr。

从IO效率上来讲,cmd >a 2>&1的效率更高。


command >out.file 2>&1 &

最后一个& , 是让该命令在后台执行。


为何2>&1要写在后面?

2>&1是标准错误拷贝了标准输出的行为。 command 2>&1 >file中,2>&1 标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>file 后输出才被重定向到file,但标准错误仍然保持在终端。


对于&1 更准确的说应该是文件描述符 1,而 1 一般代表的就是STDOUT_FILENO

2>1是什么意思呢?2与>结合代表错误重定向,而1则代表错误重定向到一个文件1,而不代表标准输出。换成2>&1,&与1结合就代表标准输出了,就变成错误重定向到标准输出。

测试:

ls 2>1 #不会报没有2文件的错误,但会输出一个空的文件1
ls myfile 2>1 #没有myfile文件的错误信息输出到了文件1中
ls myfile 2>&1 #不会生成1这个文件了,不过错误跑到标准输出了
ls myfile >out.txt 2>&1 #等价于 ls myfile 1>out.txt 2>&1;重定向符号>默认是1,错误和输出都重定向到out.txt


Related
/var/log目录下的Linux日志文件功能2019年06月24日
索引节点inode2019年06月21日
Shell脚本实例2019年06月20日
GCC编译C程序2019年06月18日
Linux内核编译/内核数据结构/同步机制/信号量2019年06月14日
shell中的算术运算2019年06月14日
iptables2019年06月14日
7 个致命的 Linux 命令2019年06月14日

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Catalog
标签列表
最新
最热
常用网站
站点信息
  • 文章总数:1995
  • 页面总数:1
  • 分类总数:17
  • 标签总数:515
  • 评论总数:0
  • 浏览总数:516418
Archives
Copyright © 2017-2019 www.my889.com Some Rights Reserved.
推荐使用 Chrome 浏览器浏览本站
沪ICP备17052342号
Sitemap XML