标准输入 (stdin)
100%

文本操作 · 第 2 课

标准输入 (stdin)

了解程序如何读取标准输入,以及 Bash 如何把这条流连接到文件。

标准输入简称 stdin,是程序通常读取传入数据的数据流。在交互式终端中,shell 一般会把 stdin 连接到终端输入,因此程序可以读取你键入的内容。

标准输入与文件描述符 0

按约定,三条标准流使用以下文件描述符编号:

  • 0:标准输入(stdin
  • 1:标准输出(stdout
  • 2:标准错误(stderr

程序可以自行决定是否以及如何使用这些流。当没有提供文件操作数或其他输入源时,设计为读取 stdin 的命令通常会等待终端输入。

按约定,哪个文件描述符表示标准输入?

把文件重定向到 stdin

< 运算符让 Bash 打开文件进行读取,并把它连接到命令的 stdin:

$ cat < peanuts.txt
Hello World

shell 负责处理 < peanuts.txtcat 只会读取文件描述符 0。该路径不会作为普通文件操作数传给 cat

如果输入文件不存在或无法打开,shell 会报告重定向错误,也不会以这份输入启动命令。

哪个命令会让 sortnames.txt 读取标准输入?

文件操作数与输入重定向

有些命令既能接受文件名操作数,也能读取 stdin,但结果可能略有不同。例如:

$ wc -l peanuts.txt
1 peanuts.txt
$ wc -l < peanuts.txt
1

两种形式都统计相同数据中的行数。第一种形式中,wc 收到文件名参数,所以知道文件名;第二种形式中,它只从 stdin 收到数据流,没有可打印的文件名。

为什么 wc -l < peanuts.txt 的输出通常不包含 peanuts.txt

组合输入和输出重定向

一条命令行可以重定向多条流:

$ cat < peanuts.txt > banana.txt

shell 会建立两条互相独立的连接:

  1. < peanuts.txt 打开 peanuts.txt 作为 cat 的 stdin。
  2. > banana.txt 创建或清空 banana.txt,并把它连接到 cat 的 stdout。

cat 从 stdin 读取字节并写入 stdout,因此 banana.txt 会收到源内容。普通文件复制用 cp peanuts.txt banana.txt 能更直接地表达意图;本例用于说明数据流连接。

cat < input.txt > output.txt 中,哪个文件提供 stdin,哪个文件接收 stdout?

要练习输入和输出重定向,可以尝试以下动手实验:

  1. Linux 中的输入和输出重定向 - 通过使用 >>>2> 等运算符以及 tee 命令来操作标准输出 (stdout)、标准错误 (stderr) 和标准输入 (stdin),练习控制命令的数据流。
  2. 数据流重定向 - 学习 Linux 流重定向的艺术。操作标准输入、输出和错误流,组合输出,并利用 /dev/null 进行高级文件操作。

课程已完成

你已完成 标准输入 (stdin)

现在,你可以通过 shell 把命令的标准输入连接到文件。

  • 知道 stdin 是文件描述符 0。

  • 使用 < 重定向可读文件。

  • 区分文件名操作数与重定向输入。

  • 有意识地组合 stdin 和 stdout 重定向。

保存学习进度

创建免费账户即可保存本课进度,并在任意设备上继续学习。

创建免费账户
下一节
返回 文本操作