连接STDOUT和STDIN是什么意思?


10

我正在读一本书,上面写着:

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

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

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

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

ps -ef | grep httpd

因此,基本上说的是,标准输入是允许用户写入文件的命令,而标准输出是具有bash shell将输出写入到shell的命令,而标准错误就像输出,但仅文件系统出错时调用。然后我们进入连接STDOUT和STDIN的部分,我迷路了。

Answers:


25

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

想象一下,将命令当作工厂中具有装配线的机器。大多数机器被设计为具有一条传送带将数据输入和一条传送带将数据输出。它们分别是标准输入和标准输出。标准错误是机器侧面上的一个开口,可以弹出不合格品。

+-------+     +------------------+       +------------------+     +------+
| 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的标准输入到文件input-file.txt启动之前commandA。(您可以在命令名之前或之后放置重定向。)>重定向符号告诉Shell将commandB标准输出连接到output-file.txt|中间的竖线(“ ”)符号指示外壳程序在启动之前将commandA的标准输出连接到commandB的标准输入。

命令可以具有多个输入和多个输出,但这对于另一天来说很重要


3
视觉效果
大有

好比喻。我已经了解流管道的概念很多年了,但是以某种方式没有人使用过工厂/传送带的类比,这使得它非常容易(并且简洁)易于理解。谢谢!
Owen Blacker

1
打个比方。如果您不介意的话,可以借用这个。
Tivie 2012年

吉尔(Gilles),我在底部问您一个问题:unix.stackexchange.com/q/96724/29146。你能澄清一下吗?
13年

@Gilles-您能否提供一个示例来说明在命令之前或之后定义重定向的选项?例如,管道可以读取为input-file.txt> commandA或input-file.txt <commandA吗?
动机

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

如上所述,要隐喻这个含义,标准输入/输出是流。邮箱或文件描述符是流的一端。管道连接是将A的标准连接到B的标准。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.