管道符"|"的背后

抱歉,我们来谈谈 Linux 命令行上的管道。
这个东西就像一个管道,将一个命令的输出作为输入传递给另一个命令,非常方便。
例如,如果您想过滤掉 file.txt 文件中包含“关键字”的行,或者计算目录中有多少个文件,您可以使用管道来执行此操作。

这个传送带就像一根水管:数据从一端流向另一端。
通道两端连接两个进程,一写一读。
标准输出是通道的写端,标准输入是读端。
然而,这个管道只处理标准输出信息,并不关心标准错误输出。

这条管道类似于供水系统。
水的流动是一致的,从一端到另一端,没有回头路。
您从空管子中读取数据,它等待水流动。
如果管道已完成写入并且读取器已完成剩余数据的读取,它将看到文件结束标记。

管道是单向的,记录端和读取端各有事务。
写入时注意不要一次写入太多,不要超过PIPE_BUF限制,以保证操作的原子性。

管道的容量是有限的,水桶也是如此。
一旦满了,它就无法容纳新的水了。
默认容量为 1 MB,但您可以将其更改为系统确定的最大值。

要创建管道,请使用 Pipe() 系统调用,它为您提供两个文件描述符:一个用于读取,一个用于写入。
读和写操作使用两个系统调用read()和write()。

该通道通常与fork()结合使用。
一个进程写入,另一个进程读取。
写入的结束关闭读取的结束,读取的结束关闭写入的结束,以便数据可以顺利传输。

在内核中,管道的读写操作是通过两个函数Pipe_read()和Pipe_write()来实现的。
内核使用锁、等待队列和信令机制来同步对通道的访问。

读取和写入的过程类似,但是读取时,如果没有数据或者内存被锁定,则立即返回错误。
进程可以在等待队列中等待,直到数据可供读取。

最后,当所有进程完成其操作后,通道索引节点和共享数据页将被释放。

linux管道符有什么作用

管道符“|”在Linux中,说实话,它是用来连接多个命令的。
上一条命令的输出直接成为下一条命令的输入。

例如这个命令:cat cathello.sh |排名|独特| grep 'better'
这里的流程是:首先使用cat读取cathello.sh文件的内容,也就是标准输出。
然后排序命令接管并对内容进行排序。
然后链接uniq命令并删除重复的行。
最后,grep 命令进行过滤,只留下包含“better”一词的行。

关键点是要记住以下命令必须能够从标准输入读取数据。
像 sort 和 grep 这样的命令可以工作,但是像 rm 和 ls 这样的命令则不行。
如果你尝试 ls | rm,系统会告诉你找不到你要删除的内容,因为 rm 不知道要删除什么。

有些命令,例如sort,可以从标准输入读取,也可以直接读取命令行参数指定的文件。
此时,命令行参数优先。
例如:
cat a.txt | sort:sort没有参数,处理标准输入a.txt的内容。

cat a.txt | sort b.txt:如果sort带有b.txt参数,则无论标准输入a.txt如何,都会先处理b.txt。

cat a.txt | sort b.txt -: - 这里显示 sort ,以下内容是标准输入,应与 b.txt 一起处理。
这相当于说对 a.txt b.txt 进行排序。

有时,上一个命令的错误消息(标准错误)不会通过管道。
例如,如果要批量删除find命令找到的临时文件,则不能直接find。
-名称“.tmp”| rm,因为 rm 无法获取文件名。
这时,你应该使用 xargs:
find 。
-名称“.tmp”| xargs rm
find 输出文件名列表。
xargs 将这些名称转换为 rm 命令行参数,以便隐藏它们。

简而言之,管道允许在命令之间传输数据,并且特别适合文字处理。
一旦了解哪些命令可以和不能接管管道,以及参数的优先级,您就可以将相当复杂的命令串在一起。
当你遇到标准输入输出问题时,xargs是一个好帮手。