当前位置:首页 > IT技术 > 系统服务 > 正文

【shell】linux输出重定向
2021-09-28 16:58:11

目录

 

​即看即用​

​详细​

 

​知识铺垫​

​说明​




即看即用

 

标准输出:

 ls thereisno 1> out.txt  标准输出重定向  也可以不加1写成 ls thereisno > out.txt

标准错误:

 ls thereisno 2> out.txt  标准错误重定向

错误:

 ls thereisno > out.txt  2>&1  把错误定向到标准输出,然后统一重定向

 所有IO:

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

 

【shell】linux输出重定向_linux

 

详细

标准输出(stdout)和标准错误(stderr),Stdout的编号为1,stderr的编号为2。

默认情况下,重定向操作符(如​​>​​,​​|​​和​​<​​)仅适用于stdout的编号1,(service --status-all |& grep network,​​|&​​将stdout和stderr一起输送到右侧标准输入(stdin)流上的进程)

操作符​​>​​重定向,将stderr(编号为2)输出定向到Stdout(编号为1),使用​​descriptor​​重定向到其他流,需要在其前面加上​​&​​(请注意,字符之间不能有空格):2>&1

service --status-all 2>&1 | grep network

 

 

知识铺垫

在实际开始前,我们先回顾一点 Linux 的知识,对于 Linux 而言:

一切都是文件

然而为了区分不同类型的事物,我们有了:

  • 普通文件
  • 目录文件
  • 链接文件
  • 设备文件

其中文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其值是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行 I/O 操作的系统调用都通过文件描述符。

【shell】linux输出重定向_标准输出_02

如果直接这么讲可能有些难以理解,对于 Linux 有一些使用的用户来说,会有类似如下的写法:


g++ lots_of_errors 2>&1 | head


其中​​2>&1​​中的 2 就是表示的「标准错误」,1 就是「标准输出」,中间的 & 表示后面跟的数字是文件描述符而不是一个文件(不然所有的「标准错误」就都重定向到了一个名为 1 的文件中了)。

 

说明

1>/dev/null 2>&1的含义


那么本文标题的语句:

1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息(将命令的输出扔弃掉了)。

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

2>&1 和 &>  的解释

 ls thereisno 1> out.txt  标准输出重定向  也可以不加1写成 ls thereisno > out.txt

 ls thereisno 2> out.txt  标准错误重定向

 ls thereisno > out.txt  2>&1  把错误定向到标准输出,然后统一重定向

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

一般在shell包括dos下都可能会这样使用。

 

1表示标准输出,2表示标准错误输出,2>&1表示将标准错误输出重定向到标准输出,这样,程序或者命令的正常输出和错误输出就可以在标准输出输出。

一般来讲标准输出和标准错误输出都是屏幕,那为什么还要这么用呢?原因是标准输出的重定向。你的例子是重定向到了null,如果重定向到文件,例如:

dir > out.txt

表示标准输出重定向到out.txt文件。此时如果dir命令出错,那么错误信息不会输出到out.txt文件,错误信息仍然会输出到屏幕——标准错误输出。为了使正确的信息和错误的信息都重定向到out.txt文件,那么需要将错误信息的标准错误输出重定向到标准输出。即命令如下:

dir > out.txt 2>&1

重定向到null是一个道理。

dir > null 2>&1

 

os.system("/etc/init.d/winbind stop >/dev/null 2>&1")


>/dev/null 将输出重定向到/dev/null,这是个空设备,也就是忽略其输出。

2>&1 是将错误输出到标准输出,如果在控制台调试,也就是屏幕上,方便调试。


 

本文摘自 :https://blog.51cto.com/l