管道输出以什么格式从一个命令/程序发送和接收到另一个命令/程序?

Aym*_*nTM 4 linux pipe executable command

当一个命令以什么方式或以什么格式通过管道传输到另一个命令时,管道输出存在/发送?是临时文件吗?是字符串吗?接收管道输出的命令如何解码/读取该输出?


例子:

echo "Someone string" | ./program | tail
Run Code Online (Sandbox Code Playgroud)

程序“ program”是否echo以文件形式接收输出?程序将如何读取该输入?

小智 5

管道是一种重定向形式(将标准输出传输到其他目的地),在 Linux 和其他类 Unix 操作系统中使用,用于将一个命令/程序/进程的输出发送到另一个命令/程序/进程以进行进一步处理. Unix/Linux 系统允许将一个命令的 stdout 连接到另一个命令的 stdin。您可以使用管道字符“|”来实现。

管道用于组合两个或多个命令,在这种情况下,一个命令的输出充当另一个命令的输入,而该命令的输出可能充当下一个命令的输入,依此类推。也可以将其可视化为两个或多个命令/程序/进程之间的临时连接。进行进一步处理的命令行程序称为过滤器。

命令/程序/进程之间的这种直接连接允许它们同时运行,并允许在它们之间连续传输数据,而不必通过临时文本文件或通过显示屏传递数据。管道是单向的,即数据通过管道从左到右流动。

句法 :

command_1 | command_2 | command_3 | .... | command_N 
Run Code Online (Sandbox Code Playgroud)

示例:列出所有文件和目录并将其作为 more 命令的输入。

$ ls -l | more 
Run Code Online (Sandbox Code Playgroud)

more命令将输出ls -l作为其输入。此命令的最终效果ls -l是一次显示一屏的输出。管道充当容器,接收输出ls -l并将其more作为输入。此命令不使用磁盘将标准输出连接ls -l到标准输入,more因为管道是在主内存中实现的。在 I/O 重定向操作符方面,上面的命令等价于下面的命令序列。

$ ls -l -> temp
more -> temp (or more temp)
[contents of temp]
rm temp
Run Code Online (Sandbox Code Playgroud)

更多1 , 2 , 3