Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载五)Linux系统的对话方式

本篇是Linux小白最佳实践第5篇,目的就是让白菜们了解Linux进程之间是如何对话的。以前连载的几篇,在微信上引发了不少的反响,有人也反映图多文字少,感受没有干货.本篇选了大部分是实战讲解的"管道与重定向"进行连载,但愿让读者能真正学到东西.segmentfault

8.3管道与重定向微信

管道与重定向是Linux系统进程间的一种通信方式,在系统管理中有着举足轻重的做用。绝大部分Linux进程运行时须要使用3个文件描述符:标准输入、标准输出和标准错误输出,对应的序号是0、1和2。通常来讲,这3个描述符与该进程启动的终端相关联,其中输入通常为键盘。重定向和管道的目的是重定向这些描述符。管道通常为输入和输出重定向的结合,一个进程向管道的一端发送数据,而另外一个进程从该管道的另外一端读取数据。管道符是“|”。编辑器

8.3.1标准输入与输出spa

执行一个Shell命令行时一般会自动打开3个标准文件,如图8.3所示。操作系统

请输入图片描述

图 8.3 Shell执行时对应的3个标准文件命令行

标准输入文件stdin,一般对应终端的键盘,标准输出文件stdout和标准错误输出文件stderr,这两个文件都对应终端的屏幕。进程将从标准输入文件中获得输入数据,将正常输出数据输出到标准输出文件,而错误信息将打印到标准错误文件。进程

现以cat 命令为例来介绍标准输入与输出。cat命令的功能是从命令行给出的文件中读取数据,并将这些数据直接送到标准输出文件,通常对应终端屏幕,如示例8-7所示。图片

【示例8-7】ip

[root@CentOS ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=00:0C:29:7F:08:9D
TYPE=Ethernet
UUID=3268d86a-3245-4afa-94e0-f100a8efae44
ONBOOT=yes
BOOTPROTO=static
BROADCAST=192.168.3.255
IPADDR=192.168.3.100
NETMASK=255.255.255.0文档

该命令会把文件ifcfg-eth0的内容显示到标准输出即屏幕上。若是cat命令行中没有参数,会从标准输入文件中通常对应键盘读取数据,并将其送到标准输出文件中,如示例8-8所示。

【示例8-8】

cat不带任何参数时会从标准输入中读取数据并显示到标准输出文件中

[root@CentOS ~]# cat
mycontent
mycontent
hello
hello
用户输入的每一行信息都会马上被cat命令输出到屏幕上。用户对输入的数据没法作进一步地处理。为解决这个问题,Linux操做系统为输入、输出的传送引入了另外两种机制:输入/输出重定向和管道。

8.3.2输入重定向

输入重定向是指把命令或可执行程序的标准输入重定向到指定的文件中。也就是输入能够不来自键盘,而来自一个指定的文件。输入重定向主要用于改变一个命令的输入源。

例如上个示例中的cat命令,当键入该命令后并无任何反应,从键盘输入的全部文本都出如今屏幕上,直至按下Ctrl+d组合键,命令才会终止,可采用两种方法:一种是为该命令给出一个文件名,另一种方法是使用输入重定向。

输入重定向的通常形式为:命令<文件名,输入重定向符号为“<”。示例8-9演示了此种状况,此示例中的文件已不是参数,而是标准输入。

【示例8-9】

[root@CentOS ~]# cat< /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=00:0C:29:7F:08:9D
TYPE=Ethernet
UUID=3268d86a-3245-4afa-94e0-f100a8efae44
ONBOOT=yes
BOOTPROTO=static
BROADCAST=192.168.3.255
IPADDR=192.168.3.100
NETMASK=255.255.255.0
[root@CentOS ~]# wc </etc/sysconfig/network-scripts/ifcfg-eth0
99 188
还有一种输入重定向,如示例8-10所示。

【示例8-10】

[root@CentOS ~]# cat <<EEE

line1
line2
line3
EEE
line1
line2
line3
标识符“EEE”表示输入开始和结束的分隔符,此名称不是固定的,可使用其余字符串,主要是一个分隔的做用。文档的重定向操做符为“<<”。将一对分隔符之间的正文重定向输入命令。例如上述示例中将“EEE”之间的内容做为正文,而后做为输入传给cat命令。因为大多数命令都以参数的形式在命令行中指定输入文件的文件名,因此输入重定向并不常用。使用某些不能利用文件名做为输入参数的命令,须要的输入内容又存在一个文件里时,能够用输入重定向来解决问题。

8.3.3输出重定向

输出重定向是指把命令或可执行程序的标准输出或标准错误输出从新定向到指定文件中。命令的输出不显示在屏幕上,而是写入到指定的文件中,以便之后的问题定位或其余用途。输出重定向比输入重定向更经常使用,不少状况下均可以使用这种功能。例如,若是某个命令的输出不少,在屏幕上不能彻底显示,那么将输出重定向到一个文件中,而后再用文本编辑器打开这个文件,就能够查看输出信息,若是想保存一个命令的输出,也可使用这种方法。还有,输出重定向可用于把一个命令的输出看成另外一个命令的输入,还有一种更简单的方法,就是使用管道,管道将在下节介绍。

输出重定向的通常格式为:命令>文件名,即输出重定向符号为“>”,使用方法如示例8-11所示。

【示例8-11】

将输出重定向到文件

[root@CentOS ~]# ls -l / >dir.txt
[root@CentOS ~]# head-n5 dir.txt
total 114
dr-xr-xr-x.2 root root4096 Jun8 00:54 bin
dr-xr-xr-x.5 root root1024 Apr 13 00:33 boot
dr-xr-xr-x.7 root root4096 Mar6 02:33 cdrom
drwxr-xr-x.18 root root4096 Jun8 01:07 data
用“ls -l”命令显示当前的目录和文件,并把结果输出到当前目录下的dir.txt文件内,而不是显示在屏幕上。查看dir.txt文件的内容可使用cat命令,注意是否与直接使用“ls -l”命令时的显示结果相同。

注意:若是“>”符号后面的文件已存在,那么这个文件将被覆盖。

为避免输出重定向命令中指定的文件内容被覆盖,Shell提供了输出重定向的追加方法。输出追加剧定向与输出重定向的功能相似,区别仅在于输出追加剧定向的功能是把命令或可执行程序的输出结果追加到指定文件的最后,这时文件的原有内容不被覆盖。追加剧定向操做符“>>”,格式为:命令>>文件名,使用方法如示例8-12所示。

【示例8-12】

使用重定向追加文件内容

[root@CentOS ~]# ls-l /usr >>dir.txt
上述命令的输出会追加在文件的末位,原来的内容不会被覆盖。

8.3.4错误输出重定向

和程序的标准输出重定向同样,程序的错误输出也能够从新定向。使用符号“2>”或追加符号“2>>”标识能够对错误输出重定向。如要将程序的任何错误信息打印到文件中,以备问题定位,可使用示例8-13中的方法。

【示例8-13】

文件不存在,此时产生标准错误输出,通常为屏幕。

[root@CentOS ~]# ls /xxxx
ls: cannot access /xxxx: No such file or directory

编号1表示重定向标准输出,但并非错误输出吗,此时输出仍打印到屏幕上

[root@CentOS ~]# ls /xxxx 1>stdout
ls: cannot access /xxxx: No such file or directory

分别重定向标准输出和标准错误输出

[root@CentOS ~]# ls /xxxx 1>stdout 2>stderr

查看文件内容,和打印到屏幕的结果一致

[root@CentOS ~]# cat stderr
ls: cannot access /xxxx: No such file or directory

将标准输出和标准错误输出都定向到标准输出文件

[root@CentOS ~]# ls /xxxx 1>stdout 2>&1
[root@CentOS ~]# cat stdout
ls: cannot access /xxxx: No such file or directory

另一种重定向的语法

[root@CentOS ~]# ls /xxxxx &>stderr
[root@CentOS ~]# ls /xxxxx/ &>stdout

查看输出文件内容

[root@CentOS ~]# head stdout
ls: cannot access /xxxxx: No such file or directory
/:
bin
boot
cdrom
因为/xxxx目录不存在,因此没有标准输出,只有错误输出。上述示例首先演示了错误输出的内容,当标准输出被重定向后,标准错误输出并无被重定向,因此错误输出被打印到屏幕上。使用“2>stderr”将错误输出定位到指定的文件中,另一种方法是将标准错误输出重定向到标准输出,执行后在屏幕上看不到任何内容,用cat命令查看文件的内容,看到上面命令的错误提示。还可使用另外一个输出重定向操做符“&>”,其功能是将标准输出和错误输出送到同一文件中。表8-3列出了经常使用的输入输出重定向方法。

表8.3经常使用的重定向含义

参数

说明

command > filename

把标准输出重定向到一个文件

command >> filename

把标准输出追加剧定向到一个文件

command 1> fielname

把标准输出重定向到一个文件

command > filename 2 > &1

把标准输出和标准错误输出重定向到一个文件

command 2 > filename

把标准错误输出重定向到一个文件中

command < filename > filename2

以filename为标准输入,filename2为标准输出

command < filename

把filename做为命令的标准输入

command << delimiter

从标准输入读入数据,直到遇到delimiter为止

8.3.5管道

将一个程序或命令的输出做为另外一个程序或命令的输入,有两种方法:一种是经过一个临时文件将两个命令或程序结合在一块儿;另一种方法是使用管道。

管道能够把一系列命令链接起来,能够将前面命令的输出做为后面命令的输入,第1个命令输出利用管道传给第2个命令,第2个命令的输出又会做为第3个命令的输入,以此类推。若是命令行中未使用输出重定向,显示在屏幕上的是管道行中最后一个命令的输出或其余命令执行异常时致使的错误输出。使用管道符“|”来创建一个管道行,用法如示例8-14所示。

【示例8-14】

[root@CentOS ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0|grep IPADD
IPADDR=192.168.3.100

管道后接管道

[root@CentOS ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0|grep IPADD|awk -F= '{print $2}'
192.168.3.100
上述示例cat命令输出的内容以管道的形式发送给grep命令,而后经过字符串匹配查找文件内容。

喜欢能够购买《超容易的Linux系统管理入门书》。写书评得奖品。
请输入图片描述

相关文章
相关标签/搜索