Linux - 输入、输出重定向的概念和用法详解(转)
1.linux 的标准输入与输出
linux标准输入设备指的是键盘,标准输出设备指的是显示器,标准错误输出指的是显示器。
设备 | 设备名 | 文件描述符 | 类型 |
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/stdout | 1 | 标准输出 |
显示器 | /dev/stderr | 2 | 标准错误输出 |
2.Linux 文件描述符
文件描述符可以理解为 Linux 系统为文件分配的一个数字,范围是 0-3 ,用户也可以自定义文件描述符,但是自定文件描述符不在这里的讨论范围
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
-
标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
-
标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
-
标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
3.什么是输入重定向
输入重定向:是指不使用系统提供的标准输入端口,而进行重新的指定。换言之,输入重定向就是不使用标准输入端口输入文件,而是使用指定的文件作为标准输入设备。(重定向简单理解就是使用 “<”符来修改标准输入设备)
比如,默认情况下,cat命令会接受默认标准输入设备键盘的输入,并显示到控制台,但是可以通过“<”符号修改标准输入设备,指定文件作为标准输入设备,那么cat命令将指定的文件作为输入设备,并将文件中的内容读取并显示到控制台。
输入重定向 | ||
类型 | 符号(语法) | 功能 |
标准输入 | 命令<文件1 | 命令把文件1的内容作为标准输入设备 |
标识符限定输入 | 命令<<标识符 | 命令把标准输入中读入内容,直到遇到“标识符”分解符为止 |
输入输出重定向(同时使用) | 命令< 文件1 >文件2 | 命令把文件1的内容作为标准输入,把文件2作为标准输出。 |
#cat /etc/passwd # 它是以键盘作为标准输入设备,并将文件内容显示到控制台
语法1:
# cat < /etc/passwd # 而输入重定向,cat < /etc/passwd ,它是将passwd文件指定为输入设备,并将内容显示到控制台。
语法2.
# cat << delimiter
# cat < <delimiter #(这个字符串字符是任意的,没有任何含义)
它的作用是将这个 delimiter 字符之前的内容(document) 作为输入传递给 cat
碰到delimiter将自动结束输入,并将输入的内容显示出来;
语法3:
# cat /etc/passwd < a > b.txt :将文件passwdt输入重定向到a,输出重定向到b.txt文件
4.输出重定向:(通俗的讲,重定向输出就是把要输出的文件信息写入到一个文件中去,而不是将要输出的文件信息输出到控制台(显示屏))
在linux中,默认的标准输出设备是控制台(或称为显示器),用户输出的信息默认情况下都会显示到控制台,
比如:cat /etc/passwd ,它是使用控制台显示内容。 默认情况下,标准输出设备是控制台,所以cat命令将文件信息输出到控制台,但是,我们可以使用“>”修饰符修改标准输出设备,使用指定的文件做为标准输出设备,来显示文件。输出重定向的概念就出现了。
4.1什么是输出重定向?
输出重定向就是指不使用linux默认的标准输出设备显示信息,而是指定某个文件做为标准输出设备来存储文件信息。
(以覆盖的方式把指定文件的信息输出到指定文件)
例如
cat /etc/passwd >a
表示,把a作为标准输出设备,并把文件信息输入到文件a中去,在使用cat a命令将信息在控制台中显示出来。
注意,如果文件a中有内容,此时内容被覆盖掉(清除掉)。
输出重定向的作用:
我们不想输出在终端上,想导出一个文件,方便以后查看,便需要输出重定向了。> 的作用就是把原本要输出在终端上的信息重定向导出到指定的地方。
输出重定向的几种用法
1.
2.使用重定向将查询的文件信息发送到其它控制台。
3.使用重定向将查询的文件信息发送到其它控制台。
其它控制台受到的消息
4.利用输出重定向清空文件、创建新文件:
当a文件中有内容,当执行 cat >a命令后,进入编辑模式,我们
输入什么内容,都会保存进去,使用ctrl+D命令结束,但如果文件a中有内容则会覆盖掉原来的内容
如果a是一个不存在的文件,则结束命令后悔添加一个名称为a的文件,刚才输入的内容会保存在这个文件中。
另一种情况,a文件存在,a文件中有内容,执行 cat >a命令后没有添加任何能容,而是直接按ctrl+d结束命令,此时
a文件中的内容会自动清空。
5.利用重定向导出一个文件
那么当我们不想输出在终端上,想导出一个文件,方便以后查看,便需要输出重定向了。> 的作用就是把原本要输出在终端上的信息重定向导出到指定的地方。
如果文件a.txt已近存在,则会将里面的内容覆盖掉。
如果不存在,将会创建一个a.txt文件,并将内容保存在这个文件中去。
使用 cat a.txt命令就可以查询到里面的内容了
6.追加内容
使用重定向输出的时候,如果原文家中有内容,则会被覆盖,现实中有时候不想覆盖其中的文件,
在使用重定向输出的使用可以使用">>",可以再源文件中追加内容
例如:
7.禁止覆盖
如果在工作中,我们想要在文件中追加内容时>>,却不小心只写入> 就执行了,那么我们的文件被覆盖了,因此就有了,禁止覆盖的命令,set –C
划蓝线的地方:明确表示不能覆盖。
当然我们也可以解除这种禁止 set +C ,很好理解禁止 –C ,解除+C
4.2标准错误输出重定向:
stderr描述符用来处理错误信息,Bash Shell会将脚本运行过程中的错误信息输出到stderr,默认情况下stderr与stdout描述符都是输出到控制台
上面的例子显示,以列表的方式显示b.txt 和errfile文件的信息并重定向文件信息到b.txt文件中,当前目录下不存在errfle文件,所以在控制台显示了警告信息,注意到这些警告信息没有输出到文件中而是控制台因为我们只重定向了标准输出到文件没有重定向标准错误输出,所以警告信息输出到了控制台。标准错误输出和标准输出默认情况下都是将信息输出到控制台。另外,重定向标准输出不会重定向表准错误输出。
标准错误输出重定向:
错误信息默认输出到控制台,也可以重定向到其他设备,从上面的表中可以看到错误输出描述符是2,只要在重定向符>之前加上一个2(如:2>),Bash Shell会将错误信息重定向到指定的设备,如下:
这个例子中将错误信息重定向到文件而标准输出还是默认的输出设备控制台.
如果同时重定向错误信息和重定向标准输出到文件必须使用两个重定向符号,并且必须在重定向符前加上相应的文件描述符,如下
此时errfile 文件是不存在的,错误文件信息被重定向输出到b.txt文件。而a.txt文件是事先存在的,被重定向到b2.txt文件
使用cat 查看,b.txt 文件存储的时错误信息,cat b2.txt 查看,是重定向输出的文件
命令 2>>文件1 1>>文件2 |
以追加方式,把命令的正确输出保存在文件2中;以追加的方式,把命令的错误输出内容保存到文件
1中 |
如果想将标准输出和错误信息重定向到一个日志文件,Bash Shell提供了&符,就不需要使用两个重定向符了,如下:
使用两个重定向符将标准输出和错误信息重定向到同一个文件中去:
使用&符将标准输出和错误信息重定向到同一个文件中去:
&>file是一种特殊的用法,也可以写成>&file,二者的意思完全相同,
也可以这样写
2>&1就是将标准错误输出重定向到与标准输出同一个文件中保存
&表示全部文件,文件不管对错,1表示标准输出文件,2表示标准错误输出。
做个总结:一下内容为截图:来源于第三方网站,如有侵权,请联系删除
参考:
[1] linux 输入、输出重定向的概念和用法详解(Day01)