『Linux学习笔记』6. 重定向

重定向的全称是"I/O重定向", 利用这个功能, 我们可以将任意的输入输出显式的重定向为文件保存在硬盘上, 亦或者将多个命令组成一个管道(pipe).

标准输入、输出和错误

到目前为止,我们用到的许多程序都会产生某种输出。这种输出,经常由两种类型组成。 第一,程序运行结果;这是说,程序要完成的功能。第二,我们得到状态和错误信息, 这些告诉我们程序进展。如果我们观察一个命令,例如 ls,会看到它的运行结果和错误信息 显示在屏幕上。

像 ls这样的程序实际上把他们的运行结果 输送到一个叫做标准输出的特殊文件(经常用 stdout 表示),而它们的状态信息则送到另一个叫做标准错误的文件(stderr)。默认情况下,标准输出和标准错误都连接到屏幕,而不是保存到磁盘文件。除此之外,许多程序从一个叫做标准输入(stdin)的地方获得设备的输入,默认情况下, 标准输入连接到键盘。

重定向操作符

在Linux(Shell)中, 使用">"或">>"来完成重定向操作, 它们的区别在于是否覆写原有内容, ">"会将所有原有内容清空, 而">>"则会在原有内容的后面继续添加连接的新内容.

与输出重定向相反, 输入重定向使用"<"操作符进行操作.

例:

ll > ll_output.txt

在上述命令中, ll的执行结果(标准输出)将被保存在"ll_output.txt"文件中而非打印在屏幕上.

标准错误重定向

在程序执行的过程中, 往往我们所看到的只是程序所执行的结果也叫"程序标准输出", 而其中的很多过程信息以及错误信息都将被忽略.

Shell中不同的输入输出采用的是数字表示法, 标准输入输出错误分别对应阿拉伯数字012. 这个定义与日志等级类似, 因此, 我们可以以此区分我们需要重定向的目标文本.

ll 2> ll_error.txt

以上, ll命令执行过程中的错误信息将被写入当前工作目录下的"ll_error.txt"文件中.

描述符重定向

当我们需要修改命令执行过程中的输入输出位置时, 就有可能需要用到描述符重定向.

如需要将ll的标准输出与标准错误都重定向到"output.txt"文件时:

ll > output.txt 2>&1 

上述命令中&1的含义即将ll命令中描述符为2(标准错误)的输出信息重定向为描述符1(标准输出), 这样命令执行的结果以及执行过程中的错误信息都将被写入"output.txt"文件中.

即&代指了命令ll的输出, 1声明了我们需要重定向的目标描述符, 而在执行操作前, ll的标准输出(1)已经被重定向为了"output.txt", 因此当我们执行 "2>&1"时, 最终指向的应该是ll 1所指向的"output.txt".

请注意, 在使用描述符重定向时, 需要清楚的认识符号"&"所代指的对象, 避免下述情况的发生:

ll 2>&1 > output.txt

上述命令中, 由于ll中描述符1和2都未经重定向, 默认值是屏幕, 此时我们先执行了2>&1, 导致标识符为2的输出(标准错误)依旧指向屏幕而非"output.txt".

隐藏输出内容

有些时候并非所有输出内容都希望被用户知悉, 因此, 在了解了重定向的基础上, 我们可以使用该功能做到将输出内容在打印于屏幕上之前将其静默处理掉.

在Linux中, 目录”/dev/null”专门存放不需要的内容, 它接受输入, 但不会进行任何处理.

ll 2>/dev/null

这样, 用户就不会知道程序执行中的错误信息了.

标准输入重定向

迄今为止我们尚未遇到需要使用标准输入重定向的地方, 但它的存在绝对是有意义的. 在介绍它之前, 我们需要先了解一个指令"cat".

cat

cat是Linux的IO指令之一, 在日后的使用中同样拥有极高的出现频率.

cat [file...]

cat可以将一个或多个文件中的内容读取并拷贝到标准输出上.

当读取多个文件时, 它会将所有文件依次拼接后显示(同样可以被重定向), 举个简单的例子:

如今大部分视频网站的网页版都会将视频分割为多个小段以最大化利用服务器, 若我们使用爬虫下载了video00.mp4~video05.mp4这6个视频片段, 那么就可以使用cat命令方便的将其拼接:

cat video0*.mp4 > video.mp4

通配符是有序执行的, 所以视频会像预期一样依次被打开并拼接起来, cat最后的输出被重定向到video.mp4文件中, 我们也就得到了一个完整的视频文件.

或许你已经注意到了, cat的参数是可选的(中括号里的参数表示该参数可选), 这也就意味着它具有默认输入位置, 它的默认输入其实就是我们在本节中需要操作的"标准输入".

当我们缺省cat的输入位置参数时, 它将会获取标准输入(键盘)所输入的内容, 直到按下ctrl+d结束, 并将获得的输入内容显示在屏幕上.

cat > keyboard_input.txt

你可以通过上面这行命令尝试获取键盘的输入内容并写入"keyboard_input.txt"文件. 记得按ctrl+d结束.

同样, 我们也可以利用标准输入重定向显式的指定cat的输入来源:

cat < keyboard_input.txt

或许现在你与我一样会有疑问, 为何不直接使用:

cat keyboard_input.txt

显然它们的执行结果是一样的, 但实际上截至目前我们只需要知道"<"操作符可以替代键盘输入即可, 相信随着学习的深入, 标准输入重定向的应用场景一定会随之体现.

原文地址:https://www.cnblogs.com/HoD7/p/14951635.html