系列文章目录
Linux-简介
LInux-文本编辑
Linux-文件系统
Linux-目录和文件操作
Linux-用户管理和文件权限
Linux-进程管理
Linux-重定向和管道
Linux-网络编程
Linux-常用命令
stdin/stdout/stderr
Linux进程在启动后,通常就会打开3个文件句柄,标准输入文件(stdin),标准输出文件(stdout)和 标准错误文件(stderr)。
Linux进程,要从用户那里读入输入的信息,就是从stdin文件里面读取信息,要输出信息给用户看都是输出到 stdout, 要输出错误提示给用户看都是输出到 stderr。
而缺省情况下这三个文件stdin、stdout、stderr 都指向 —— 终端设备。
Linux进程从stdin里面读取信息其实就是从终端设备(比如终端模拟程序Putty)读取信息;Linux进程写入信息到stdout或者stderr,其实就是打印到终端设备上。
Stdout、Stderr重定向
如果我们在Shell中输入命令的时候,使用 > 符号, 就可以将输入信息输出到其他文件(包括设备文件)中去。
例如:
[Mrliu@mrliu ~]$ ps > out
运行后,我们会发现Putty终端窗口里面则没有任何内容打印出来了,通过cat命令,我们在out文件中读取跟上面一样的结果。
这个 > 就是 stdout 重定向符号, 它表示 stdout 不是指向 终端设备了,而是 重定向到 out 文件。 所以stdout 指向了 out 文件, 输入的信息就到 out 文件了。 终端屏幕上就没有信息了。
此时,对应示意图如下:
但是重定向Stderr跟Stdout是不同的,重定向符号是2>,我们输入一个不存在的命令
例如:
[Mrliu@mrliu ~]$ ps asdf 2> err
运行后,发现跟上面结果一样
如果我们要,同时重定向stdout和stderr到同一个文件both中,需要加上 &>,命令写法如下:
[Mrliu@mrliu ~]$ command &> both
这个用法通常用在一些网络服务,需要记录一些日志信息等。
如果我们要,重定向stdout到out文件,并重定向stderr到err文件,命令写法如下:
[Mrliu@mrliu ~]$ command > out 2>err
stdin重定向
我们也可以在命令中,将 标准输入stdin 重定向,使用符号 <
例如下面程序:
for i in xrange(3):
data=raw_input()
print ('%s+1=%s' % (data,int(data)+1))
该程序是从终端都三次输入,每次的结果+1,然后输出
接下来我们将输入重定向到其他文件,首先,再创建一个文件add.dat
执行命令,结果如下:
这个 < 就是 stdin 重定向符号, 它表示 stdin 不是指向 终端设备了,而是 重定向到 add.dat 文件。 所以 stdin 指向了 add.dat 文件, 程序就从add.dat 文件读入信息 了。
对应示意图:
通过输入重定向,我们可以完成一些事先已知的操作,写好需求,通过自动化完成,节省人工成本。
管道
在Linux操作过程中,我们经常需要 将一个命令的输出的内容,给另一个命令作为输入的内容进行处理。这时候就可以用到管道,而使用管道,我们可以通过管道操作符来实现。例如:
ps –ef | grep 6536
其中的 竖线 | , 这个就是管道操作符,它起的作用就是
● 将 前面的 ps –ef 命令的stdout(本来是输出到终端设备的) 重定向到一个 临时管道设备里面,
● 同时 将后一个命令 grep 6536 的stdin重定向到这个临时的管道设备。
示意图如下:
下面我们通过命令行来演示一下:
如果我们想到进程中包含65的命令,下面直接输出太多了
用ps -ef 可以显示出所有的进程信息,而grep命令可以从文件中过滤出包含指定字符串模式的行。这时,将两者结合并使用管道操作符“|”就可以实现
通过管道操作,等价于分别将输出重定向到文件,然后再从文件中读取
例如:
引入管道后,大大提高了效率。