一、输入重定向和输出重定向

通常计算机的I/O(输入/输出)设备为键盘和显示器,因此当我们执行cat命令而不加任何参数时,命令会等待用户通过键盘输入数据;而当我们为cat命令增加了参数/etc/rc.d/rc.sysinit后,cat命令的输入源变成了文件/etc/rc.d/rc.sysinit。这个过程就是输入重定向。如果cat的结果不显示在屏幕中,而是输出到某个文件中,其过程就是输出重定向。


二、管道


管道事实上是一种重定向的过程。管道的一方是数据的输入端,一方是接收端。bash也支持管道,其形式为:

# COMMAND1 | COMMAND2

解释:

程序执行的过程可能是:读入数据-->执行命令-->输出结果。根据此过程,原本COMMAND1执行的结果应该显示在屏幕上,但使用管道后,COMMAND1的执行结果会被COMMAND2当做输入数据流使用。


例如使用cat命令查看 /etc/rc.d/rc.sysinit 这个文件时,会发现此文件非常长,cat命令执行后光标直接跳至文件底部,给阅读造成不便。这时我们可以使用管道的形式用less来查看这个文件:

# cat -n /etc/rc.d/rc.sysinit | less    

此处less命令不加参数,而是使用cat命令的执行结果作为参数。

wKiom1NiVOCTqT9FAALm7_PE968308.jpg


再比如用户登陆时需要密码,通过键盘输入密码是默认形式,但为了安全起见,我们可以对密码输入进行重定向,选择从文件读入密码。可以使用以下命令:

# echo pass123 | passwd --stdin openstack


wKioL1NiVOziOV1zAAJBJsQ2MH4931.jpg


我们也可以将某个变量作为输入数据传递给下一个命令。例如要新建用户user1,其家目录为/users/user1,密码同用户名,可使用如下操作:

 # UserName=user1

 # mkdir /users

 # useradd -d /users/$UserName $UserName

 # echo $UserName | passwd --stdin $UserName

wKiom1NiVWLCmxkzAAI1s_w1UnY641.jpg


注意passwd命令使用了选项 --stdin Standard Input 的简写形式),意为标准输入,即默认输入,与之对应的有 --stdout Standard Output),意为标准输出,即默认输出——显示器/监视器。


* 后续文章中将详细介绍输入输出重定向和管道,此处只做简要概述