管道和输入输出
1、管道
(1)管道使用“|”作为操作符,这个符号通常位于键盘上的Enter或者退格键BackSpace附近。管道的格式为:
#command1 | command2 | command3 ...
系统执行上面的命令时,会先执行命令command1,并通过管道将command1的输出结果交给命令command2处理.然后再将command2的结果传给下一个命令command3,这样一直将结果传递下去,直到最后一个命令.在这个过程中,管道后面的命令总是使用管道前面的命令输出作为命令的输入.
(2)许多时候需要在某个命令的输出中筛选结果,这是管道最常见的用法之一。例如查看系统中是否已经安装了gcc编译器软件包:
[root@localhost ~]# rpm -aq | grep gcc gcc-c++-4.1.2-14.el5 libgcc-4.1.2-14.el5 gcc-4.1.2-14.el5 gcc-gfortran-4.1.2-14.el5
上面这条命令中,先使用命令rpm -aq输出系统中已安装的所有软件包,然后利用管道将结果传递给下一条命令grep gcc。后者将从已安装的软件包列表中筛选出名称中含有gcc的行并输出。
(3)管道的另一个常见的用法是辅助处理命令输出。
2、命令的输入、输出和错误
标准输入(默认为键盘):文件描述符为0
标准输出(默认为显示器):文件描述符为1
标准错误输出(默认为显示器):文件描述符为2
3、重定向命令的输入、输出和错误
(1)输出重定向
> :覆盖式写入
>> :追加式写入
提示:如果要向系统配置文件(特别是/etc目录中的文件)添加内容,通常应该使用追加的方式,以免损坏系统。
(2)输入重定向
< :大多时候输入重定向使用的是一个文件
<< :这个操作符被形象地称为here document(这儿文档),下面以一个示例进行讲解
[root@localhost ~]# cat <<END > This is the first line. > This is the second line. > This is the last line. > END This is the first line. This is the second line. This is the last line.
在上面这条命令中,cat命令用于输出文本,<<操作符后面的END指示了结束输入的标记。按Enter键之后用户就可以开始输入文本,直到输入的字符为END时,输入过程才会结束。
(3)错误重定向
执行一个命令时可能会有很多输出,由于命令的输出信息和错误信息混合在一起,可能无法看到错误的信息,这时可以将标准错误重定向到文件中,以便于用户查看。例如将错误信息重定向到文件error中:
[root@localhost ~]# ls anaconda-ks.cfg Desktop install.log install.log.syslog [root@localhost ~]# rm abcd 2>error [root@localhost ~]# ls anaconda-ks.cfg Desktop error install.log install.log.syslog [root@localhost ~]# cat error rm: cannot lstat `abcd': No such file or directory
默认情况下,重定向符“<”和“>”表示重定向输入和输出,因此在重定向错误时必须使用“2>”明确表示将标准错误进行重定向。
技巧:当我们不想看到错误信息时(例如在系统启动脚本中运行某个命令可能会产生错误),可以将错误信息重定向到系统垃圾池/dev/null。
有时某条命令会产生很多条错误,为了不让后一条错误信息覆盖前面记录的文本,此时应该使用“2>>”将错误追加到文件最后。
(4)输出和错误同时重定向
可以使用“2>&1”或者“&>”
[root@localhost ~]# ping 192.168.1.1 -c3 > /dev/null 2>&1 [root@localhost ~]# ping 192.168.1.1 -c3 &>/dev/null
技巧:制作系统监控脚本、自动任务脚本时,经常需要将可预见的命令输出和错误重定向到系统垃圾池中。这样做的目的是避免产生的输出、错误干扰用户正在进行的工作。
也可以同时重定向命令的输入和输出,例如:
[root@localhost ~]# sed '1,300d' <netstat.txt >netstat_1
将命令的输出和错误同时重定向是管理和维护Linux系统过程中最常见的用法之一。