程序通过输入/输出流通信。标准输出简称 stdout,是程序通常用来传递正常结果的数据流。在终端中,shell 最初会把这条流连接到终端显示区域。
文本操作 · 第 1 课
标准输出 (stdout)
了解标准输出如何流向终端,以及 Bash 如何把它重定向到文件。
写入标准输出
$ echo Hello World
Hello World
stdout 的文件描述符是 1;重定向多条流时,这个数字会很有用。程序还可以拥有标准输入 stdin 和标准错误 stderr,后续课程会介绍它们。
没有重定向时,交互式终端中的 echo Hello World 通常会把正常输出发送到哪里?
使用 > 替换文件
Bash 会把 > 解释为输出重定向运算符。它打开目标文件,并把命令的 stdout 连接到该文件:
$ echo Hello World > peanuts.txt
文字不再显示在终端,因为 stdout 流向了 peanuts.txt。如果文件不存在,shell 会创建它;如果文件已经存在,shell 会在命令写入前清空它,原内容会丢失。
使用 cat 检查结果:
$ cat peanuts.txt
Hello World
notes.txt 已经包含文字。echo new > notes.txt 会做什么?
因为 shell 会在命令运行前打开目标,所以按 Enter 前必须确认路径。即使命令随后失败,拼错或选错的现有文件也可能已被清空。
使用 >> 追加到文件
需要把新的 stdout 添加到文件现有内容之后时,请使用 >>:
$ echo Another line >> peanuts.txt
$ cat peanuts.txt
Hello World
Another line
与 > 一样,>> 也会创建缺失的目标。区别在于打开现有文件的方式:>> 会追加,而不是清空。
哪个命令会把 Finished 添加到 status.log 末尾,而不擦除现有内容?
重定向由 shell 处理
shell 会识别 > 和 >>,不把这些运算符作为参数传给程序,而是打开文件并建立数据流连接。命令本身仍照常向 stdout 写入。
因此,相同的重定向语法适用于许多命令:
$ pwd > current-directory.txt
$ ls -la >> directory-list.txt
在 pwd > current-directory.txt 中,通常由谁解释 >?
要练习标准流重定向,可以尝试这个动手实验:
- 在 Linux 中重定向输入和输出 - 通过使用
>、>>、2>等运算符以及tee命令来操作标准输出 (stdout)、标准错误 (stderr) 和标准输入 (stdin),练习控制命令的数据流。
课程已完成
你已完成 标准输出 (stdout)
现在,你可以重定向命令的标准输出,并正确区分替换与追加行为。
知道 stdout 是承载命令正常结果的数据流。
使用
>替换文件内容。使用
>>保留现有内容并追加。在 shell 打开目标前确认路径。