关注

“脚本之家

”,与百万开发者在一起

出处:浩道linux(ID:hao_tiyu)

如若转载请联系原公众号

前言

本文给大家分享linux中常见的2>&1符号具体运用以及平时shell脚本中常见的>、>>、2>、2>>、<、<<等那些奇奇怪怪的符号,通过简单通俗的例子,让你真正搞懂shell。

一、linux中输入输出重定向知识回顾

linux系统中,通常是命令从你的终端接受输入并将所产生的输出发送回到你的终端。一个命令通常从一个叫标准输入的地方读取输入,而默认情况下,这刚好就是你的终端。同样的,一个命令通常将其输出写入到标准输出,而默认情况下,这也正好是你的终端。

但是有时候我们并不希望命令从标准的地方输入,也不希望命令输出写入到标准输出。此时我们就可以采用输入输出重定向,让其输入或者输出都重定向到其它地方,如文件等。这就是输入输出重定向的由来了。

undefined

二、linux中输入输出重定向命令符号有以下几种

hosts域名重定向未生效(域名重定向是什么意思)  第1张

1、>:作用是将标准输出重定向到一个文件中(会清空原有文件的内容),主要用法是:命令 > 文件;

2、 >>:作用是将标准输出重定向到一个文件中(追加到原有文件内容后面),主要用法是:命令 >> 文件;

3、 < : 作用是将文件作为命令的标准输入,主要用法是:命令 < 文件;

4、<<: 作用是从标准输入中读入,直到遇见“分界符”才停止, 主要用法是:命令 << 分界符;

三、 linux系统中文件描述符

linux中谈到输入输出重定向时,必然少不了文件描述符,那么什么是文件描述符呢?

首先学习之前,我们通过ll /home命令查看/home目录下的文件列表。如下图所示:

我们发现/home目录下可以看到一系列的文件列表,因为/home目录确实存在。

其次,我没呢通过ll /haotest命令查看一下/haotest目录下的文件列表。如下所示:

[ root@centos7 ~] # ll /haotest

ls: 无法访问/haotest: 没有那个文件或目录

我们发现报错了,因为我主机上不存在/haotest这个目录。

通过上面两条执行命令发现,都有返回结果。实际上两个返回结果有所差异。我们称第一个返回结果为 标准输出,第二个返回结果为 错误输出。实际上,这就是linux系统中的文件描述符。文件描述符是一个非负整数,在打开现存文件或新建文件时,内核会返回一个文件描述符,读写文件也需要使用文件描述符来访问文件。

linux系统中文件描述符存在以下三种:

1、标准输入(stdin, 文件描述符为0):默认是从键盘输入;

hosts域名重定向未生效(域名重定向是什么意思)  第2张

2、标准输出(stdout, 文件描述符为1):默认从屏幕输出;

3、错误输出(stderr, 文件描述符为2):默认从屏幕输出;

四、输入输出重定向与文件描述符结合

正是因为存在以上三种文件描述符,所以就会存在将这三种文件描述符对应的输入输出进行重定向的可能。而默认情况下, 命令 > 文件是将 stdout(标准输出)重定向到 文件, 命令 < 文件将stdin(标准输入)重定向到 文件。

那 stderr(错误输出)该如何重定向呢?如下所示:

1、 2>:作用是将错误输出重定向到一个文件中(会清空原有文件的内容),主要用法是:命令 2> 文件;

2、 2>>:作用是将错误输出重定向到一个文件中(追加到原有文件内容后面),主要用法是:命令 2>> 文件;

注意:这里的2和>之间不能有空格,2>是一体的时候才表示错误输出。

不知道大家发现没有,讲了这么多,我们的主角 2>&1似乎还没有登场呢!其实 它就是将stdout(标准输出)和stderr(错误输出)合并后进行重定向的。

于是就有如下 2>&1重定向命令了。

1、 > 2>&1 :作用是将标准输出与错误输出都重定向到文件中( 会清空原有文件的内容),主要用法是: 命令 > 文件 2>&1;

2、 >> 2>&1:作用是将标准输出与错误输出都重定向到文件中(追加到原有文件内容后面),主要用法是:命令 >> 文件 2>&1;

五、输入输出重定向实战演练

下面会通过具体命令进行实战,一一带大家熟悉以上罗列各命令的具体使用方法。

1、 命令 > 文件命令用法:

如我系统家目录下想执行ls -l命令,但是不想让结果打印输出到屏幕,想重定向放到print01.txt文件,则完整命令如下:

[root@haodaolinux1 ~]# ls -l > print01.txt

通过cat print01.txt命令是可以查看到ls -l所罗列的内容的,如下图所示:

2、命令 >> 文件命令用法:

该命令与 命令 > 文件区别在于无论执行多少次,都会在文件中追加保存执行结果,不会覆盖原文件内容。

如我系统家目录下想执行ls -l命令,但是不想让结果打印输出到屏幕,想重定向放到print02.txt文件,并且每次执行不会清空覆盖文件中已有内容,则完整命令如下:

[root@haodaolinux1 ~]# ls -l >> print02.txt

大家可以执行命令看看,执行多少次,print02.txt文件中就会保存多少次结果。

3、 命令 < 文件命令用法:

如我有print03.txt文件内容如下图所示:

现在想通过输入重定向统计print03.txt文件中有多少行的内容,具体命令如下:

[root@haodaolinux1 ~]# wc -l < print03.txt

4

[root@haodaolinux1 ~]#

4、 命令 << 分界符命令用法:

如我想统计我在屏幕上输入多少行内容,可以通过如下命令:

[root@haodaolinux1 ~]# wc -l << tag

> 好好学习

> 天天向上

> 浩道linux

> tag

当敲完 最后一个tag命令后, 回车,便可以看到屏幕输出3,即我在屏幕上输入了3行内容。

5、 命令 2> 文件命令用法:

这个跟 命令 > 文件的用法差不多,区别在于文件描述符不一样。如我想通过cat命令查看一个文件hhhh.txt的内容,但是这个hhhh.txt文件不存在,此时想把错误输出重定向到print04.txt文件中,具体命令如下:

[root@haodaolinux1 ~]# cat hhhh.txt 2> print04.txt

执行命令后,查看print04.txt中的内容如下图所示:

并且无论 cat hhhh.txt 2> print04.txt执行多少次,只会保存一条结果,即清空原文件内容进行保存。

6、 命令 2>> 文件命令用法:

这个跟 命令 2> 文件的用法一样,区别在于将错误输出重定向追加保存到文件当中,不会覆盖原文件内容。

如我想通过cat命令查看一个文件aaaa.txt的内容,但是这个aaaa.txt文件不存在,此时想把错误输出重定向到print05.txt文件中,具体命令如下:

[root@haodaolinux1 ~]# cat aaaa.txt 2>> print05.txt

7、 命令 > 文件 2>&1命令用法:

1) 首先在当前目录创建一个print06.txt文件,文件写进内容:欢迎关注公众号:浩道linux;

2)执行 ls -l > print06.txt 2>&1命令,此时会将ls -l命令输出结果覆盖保存到print06.txt文件,如下图所示:

3)执行 cat cccc.txt > print06.txt 2>&1命令 (其中cccc.txt文件并不存在), 此时会报错,并将错误输出追加保存到print06.txt文件中,原有文件内容被覆盖,如下图所示:

8、 命令 >> 文件 2>&1命令用法:

这个跟 命令 > 文件 2>&1命令用法差不多,区别在于标准输出重定向或错误输出重定向追加保存到文件当中,不会覆盖原文件内容。

具体命令如下:

[root@haodaolinux1 ~]# ls -l >> print06.txt 2>&1

[root@haodaolinux1 ~]# cat cccc.txt >> print06.txt 2>&1

以上就是针对各个输入输出重定向命令一一举例说明。相信此时你对 2>&1不再陌生,其实实际工作中用得最多的还是 2>&1,它主要用在将某些命令执行结果重定向到/dev/null文件当中,/dev/null是一个特殊的文件,写入到它的内容都会被丢弃 ,即可以起到禁止输出的作用,主要命令格式如下:

命令 >> /dev/null 2>&1

程序员专属卫衣

商品直购链接👇

终于!我找到程序员爱穿卫衣的原因了 !!!

如何理解 Linux shell中“2>&1”?

两操作系统间文件互传,你只会用Xshell ?

按下ls -l *.py并回车,shell都为我们做了什么?

推荐:4 款专属极客卫衣,程序员秒懂!

每日打卡赢积分兑换书籍入口