1. 标准输入、标准输出、标准错误
文本流存在于Linux的每个进程中。当Linux启动一个进程时,会自动打开三个的端口:标准输入(Standard Input)、标准输出(Standard Output)和标准错误(Standard Error)。进程通常会通过这三个端口进行输入和输出。
以bash进程为例,一个运行的bash就是一个进程。默认情况下,bash的标准输入连接到键盘上,标准输出和标准错误连接到屏幕。对于一个程序来说,虽然它总会打开这三个流,但是他会根据需要使用,并不一定要使用。
如:
$ ls # 获取当前的路径下的文件夹的名字后,把这些我文件合成一段文本,用标准输出打印在终端
$ rm none-exits-file # 删除也个不存在的文件,错误信息会通过标准错误电口输出:rm: cannot remove 'none-exits-file': No such file or directory
2.重新定向
当bash运行一个命令时,这个bash会创建一个子进程用于命令的运行。默认情况下,由于子进程的标准输出与bash相同,因此输出内容出现在bash窗口。如果想让文本流流到文件而不是显示在屏幕上,那么我们可以利用重定向(redirect)的机制。
- 标准输出
$ ls > output.log # 使用 > 将ls输出的文本流导入一个文件中
$ ls >> output.log # 使用 >> 将ls输出的文本流导入一个文件中
注意: > 和 >> 在output.log不存在时,两者相同,都是新建output.log并将文本流导入。如果output.log不存在时,使用 >> 会将文本添加在结尾。使用 > 会重新新建个文件,覆盖已经存在的文件。
- 标准错误
单一的 > 和 >> 符号默认只会重新定向标准输出。 使用 1 代表标准输入,2 代表标准错误。或者使用&> 同时将标准输入和标准输出重定向。
$ rm none-exit-file 2> error.log # 将错误输出到error.log文件中
$ ls 1> output.log 2> error.log # 将标准输出流导入文件output.log,将标准错误输出到error.log
$ ls &> output_error.log # 将标准输出和标准错误指向同一个文件。
注意:1> 中间不能有空格
- 标准输入
使用 < 来重定向标准输入
$ grep abc < content.txt # 将文件content.txt输入到标准输入流中,将包含“abc”的某一行输出到标准输出中
$ grep abc < content.txt &> output.txt # 重定义标准输入的同时,重新定义标准输出和标准错误
3.管道
管道(pipe)也是变更文本流的方向。管道的目的地是另一个进程。借用管道,我们可以把一个进程的输出变成另一个进程的输入。这样我们可以用管道把多个命令连接在一起。从而让他们像流水线一样连续不断的处理文本流。在bash中,我们使用 | 表示管道。
$ ps | grep test # ps 将输出的文本流 通过管道 导入到grep命令进行过滤 将包含test的行导入到标准输出
$ grep Tom < input.txt | sort # 从文件中找出所有包含文本“Tom”的行,并按照字母表进行排序
$ ls | grep txt | wc -l # 输出当前目录中,包含txt文件的总数