标准输入简称 stdin,是程序通常读取传入数据的数据流。在交互式终端中,shell 一般会把 stdin 连接到终端输入,因此程序可以读取你键入的内容。
文本操作 · 第 2 课
标准输入 (stdin)
了解程序如何读取标准输入,以及 Bash 如何把这条流连接到文件。
标准输入与文件描述符 0
按约定,三条标准流使用以下文件描述符编号:
0:标准输入(stdin)1:标准输出(stdout)2:标准错误(stderr)
程序可以自行决定是否以及如何使用这些流。当没有提供文件操作数或其他输入源时,设计为读取 stdin 的命令通常会等待终端输入。
按约定,哪个文件描述符表示标准输入?
把文件重定向到 stdin
< 运算符让 Bash 打开文件进行读取,并把它连接到命令的 stdin:
$ cat < peanuts.txt
Hello World
shell 负责处理 < peanuts.txt;cat 只会读取文件描述符 0。该路径不会作为普通文件操作数传给 cat。
如果输入文件不存在或无法打开,shell 会报告重定向错误,也不会以这份输入启动命令。
哪个命令会让 sort 从 names.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 会建立两条互相独立的连接:
< peanuts.txt打开peanuts.txt作为cat的 stdin。> banana.txt创建或清空banana.txt,并把它连接到cat的 stdout。
cat 从 stdin 读取字节并写入 stdout,因此 banana.txt 会收到源内容。普通文件复制用 cp peanuts.txt banana.txt 能更直接地表达意图;本例用于说明数据流连接。
在 cat < input.txt > output.txt 中,哪个文件提供 stdin,哪个文件接收 stdout?
要练习输入和输出重定向,可以尝试以下动手实验:
- Linux 中的输入和输出重定向 - 通过使用
>、>>、2>等运算符以及tee命令来操作标准输出 (stdout)、标准错误 (stderr) 和标准输入 (stdin),练习控制命令的数据流。 - 数据流重定向 - 学习 Linux 流重定向的艺术。操作标准输入、输出和错误流,组合输出,并利用
/dev/null进行高级文件操作。
课程已完成
你已完成 标准输入 (stdin)
现在,你可以通过 shell 把命令的标准输入连接到文件。
知道 stdin 是文件描述符 0。
使用
<重定向可读文件。区分文件名操作数与重定向输入。
有意识地组合 stdin 和 stdout 重定向。