连接 STDOUT 和 STDIN 是什么意思?

Joh*_*ino 10 shell pipe io-redirection stdout stdin

我在看一本书,上面写着:

每个进程至少有三个可用的通信通道:“标准输入”(STDIN)、“标准输出”(STDOUT)和“标准错误”(STDERR)。

大多数命令接受来自 STDIN 的输入并将其输出写入 STDOUT。他们将错误消息写入 STDERR。此约定允许您像构建块一样将命令串在一起以创建复合管道。

Shell 将符号<>和解释>>为将命令的输入或输出重新路由到文件或从文件重新路由的指令。

要将一个命令的 STDOUT 连接到另一个命令的 STDIN,请使用| 通常称为管道的符号。

ps -ef | grep httpd
Run Code Online (Sandbox Code Playgroud)

所以基本上这就是说标准输入是一个允许用户写入文件的命令,而标准输出是一个命令让 bash shell 将输出写入 shell,而标准错误就像输出一样,但它只是当文件系统出现错误时调用。然后我们到了连接 STDOUT 和 STDIN 的部分,我迷路了。

Gil*_*il' 25

标准输入和标准输出不是命令。

把命令想象成工厂里有装配线的机器。大多数机器都设计有一条传送带输入数据和一条传送带输出数据;它们分别是标准输入和标准输出。标准错误是机器侧面的开口,它可以弹出次品。

+-------+     +------------------+       +------------------+     +------+
| input |     |    machine A     |       |    machine B     |     |output|
| reser ­­­|=====|<stdin     stdout>|=======|<stdin     stdout>|=====|bucket|
| ?voir |  ?  |      stderr      |   ?   |      stderr      |  ?  |      |
+-------+     +------------------+       +------------------+     +------+
                      ||                          ||
Run Code Online (Sandbox Code Playgroud)

上图显示了一条穿过两台机器的传送带。数据来自左侧的输入库,被送入机器 A,然后输出进一步传送到机器 B(它是输入),机器 B 的输出存放在右侧的输出桶中。

在 unix 术语中,这称为管道。比喻是管道:一个管道将机器 A 连接到机器 B。上面管道的 shell 语法是

<input-file.txt commandA | commandB >output-file.txt
Run Code Online (Sandbox Code Playgroud)

< 重定向符号告诉shell连接commandA的标准输入到文件input-file.txt启动之前commandA。(您可以将重定向放在命令名称之前或之后。)>重定向符号告诉 shell 将commandB的标准输出连接到output-file.txt|中间的管道 (" ") 符号告诉 shell在启动它们之前将commandA的标准输出连接到commandB的标准输入。

命令可以有多个输入和多个输出,但这是另一天的材料。

  • 视觉帮助很大 (3认同)

Spl*_*aos 6

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 处理输入并将自己的邮件放入发件箱,这就是您在终端上看到的。

如前所述,去掉比喻,标准输入/输出是流。邮箱或文件描述符是流的一端。To pipe 是将 A 的标准输出连接到 B 的标准输入。