我正在看一本书,书中写道:
每个进程至少有三个可用的通信通道:“标准输入”(STDIN)、“标准输出”(STDOUT)和“标准错误”(STDERR)。
大多数命令接受来自 STDIN 的输入并将其输出写入 STDOUT。他们将错误消息写入 STDERR。通过这种约定,您可以像构建块一样将命令串在一起以创建复合管道。
shell 将符号
<
、>
和>>
解释为将命令的输入或输出重新路由到文件的指令。要将一个命令的 STDOUT 连接到另一命令的 STDIN,请使用
|
通常称为管道的符号。ps -ef | grep httpd
所以基本上这就是说,标准输入是一个允许用户写入文件的命令,而标准输出是一个让 bash shell 将输出写入 shell 的命令,标准错误就像输出一样,但它只是当文件系统出现错误时调用。然后我们开始连接 STDOUT 和 STDIN 的部分,但我迷路了。
答案1
标准输入和标准输出不是命令。
将命令想象为工厂中带有装配线的机器。大多数机器都设计有一条传送带用于输入数据,另一条传送带用于输出数据;它们分别是标准输入和标准输出。标准错误是机器侧面的一个开口,可以在其中弹出废品。
+-------+ +------------------+ +------------------+ +------+
| input | | machine A | | machine B | |output|
| reser |=====|<stdin stdout>|=======|<stdin stdout>|=====|bucket|
| ‑voir | → | stderr | → | stderr | → | |
+-------+ +------------------+ +------------------+ +------+
|| ||
上图显示了一条穿过两台机器的传送带。数据来自左侧的输入存储库,被馈送到机器 A,然后输出进一步传送到机器 B(为其输入),机器 B 的输出存入右侧的输出桶中。
在 Unix 术语中,这称为管道。这个比喻就像管道一样:一条管道将机器 A 连接到机器 B。上面管道的 shell 语法是
<input-file.txt commandA | commandB >output-file.txt
这<
重定向符号告诉 shell在启动之前将commandA
标准输入连接到文件。 (您可以将重定向放在命令名称之前或之后。)重定向符号告诉 shell 将的标准输出连接到。中间的管道(“ ”)符号告诉 shell 在启动它们之前将的标准输出连接到的标准输入。input-file.txt
commandA
>
commandB
output-file.txt
|
commandA
commandB
命令可以有多个输入和多个输出,但这对于另一天。
答案2
standard input is a command that allows user to write to a file
不是命令,而是流。标准进出就像邮箱一样。当程序启动时,它会被赋予一个用于接收邮件的框和一个用于发送邮件的框。通常,输入来自键盘并放入收件箱,放入发件箱的邮件最终显示在终端屏幕上。
standard output is a command that has the bash shell write output to the shell
该程序实际上并不知道标准输出点在哪里。当您通过管道将 A 传送到 B 时(如图所示$ A | B
),当 A 将邮件放入发件箱时,它最终会到达 B 的收件箱。 B 处理输入并将自己的邮件放入发件箱,这就是您在终端上看到的内容。
如上所述,标准输入/输出是流。邮箱,或文件描述符,是流的一端。连接管道就是将 A 的标准输出连接到 B 的标准输入。