linux/unix系统中管道操作符/管道字符(垂直条字符"|")的可执行文件是什么

gfa*_*fan 0 unix linux syntax shell

通常,我们在Linux系统的terminal/tty/command窗口中运行命令.如果我们跑ls -l,我们知道,我们实际上执行命名文件ls所在/bin.完整的道路/bin/ls.

在类似*nix的系统中有很多关于管道的讨论.对应于系统中的确切可执行文件是什么|?即使管道功能是在系统中构建的,也应该找到一段代码.我找不到相关的文档.从Google的结果页面中获取答案并不是一件容易的事.

我已经阅读了一些关于管道创建的基本信息或者与C语言中的管道编程相关的东西.那些看起来与行为非常不同|.shell中的管道运算符("|")是否与基本C编程书中描述的示例完全相同?

除了|,管道字符,什么是相应的文件>,和<

更新1:在从下面的帖子中得到一些答案之后,我认为管道机制的原始骨架被称为"假管"来自http://www.linfo.org/pipe.html

asc*_*ler 6

字符<,,,不是与诸如 之类的可执行文件相同意义上的>进程。相反,它们是对 shell 的指令,用于修改其他进程的创建方式。>>|ls

首先,请注意,无论您如何输入 Linux 命令,您都没有真正直接与 Linux 操作系统本身进行交互。您正在使用一个称为 shell 的程序 - 最有可能的是/bin/bash,但是有几种不同的 shell 程序可用,其中大多数以基本相同的方式运行。shell 的主要目的是解释您的输入以启动其他进程。这涉及 Linux 系统调用fork(或可能clone)来创建一个新进程作为 shell 进程的子进程,然后是系统调用execve来让该子进程加载并使用指定的参数运行指定的程序。

shell 可能会对输入进行各种解释,以确定实际的程序和参数是什么,例如替换命令别名、替换环境变量以及扩展~*[]字符。同样,<>>>|符号对 shell 具有特殊含义,但它们不是修改可执行文件名称或参数,而是准确修改子进程的创建方式。

Linux 进程通常以打开的三个“文件句柄”开始生命:标准输入、标准输出和标准错误。默认情况下,shell 的子进程将使用与 shell 相同的输入/输出/错误,这意味着它们可以通过与 shell 相同的机制从键盘获取输入,并且进程的输出出现在同一窗口中。当使用<>>>重定向指令时,shell 将修改 和 之间进程的文件句柄,fork以便execve在子进程中启动可执行文件之前,一个或多个其默认文件句柄实际上将从 / 读取写入指定的文件。

当使用“管道”字符时|,shell 将几乎同时启动两个子进程,但第一个进程的输出连接到第二个进程的输入。这涉及系统调用pipe,以创建一对文件句柄,其中写入一个句柄只是将数据放入操作系统内存中,直到从另一个句柄中读出数据为止。

例如,

grep 'MAGIC' file1.txt | sort
Run Code Online (Sandbox Code Playgroud)

将(不一定按此顺序):

  1. 创建一对管道文件句柄
  2. 为该grep命令创建一个子进程。
  3. 替换子级的标准输出文件句柄以使用管道的写入端。
  4. grep通过开始命令execve
  5. 为该sort命令创建一个子进程。
  6. 替换子级的标准输入文件句柄以使用管道的读取端。
  7. sort通过开始命令execve
  8. 等待sort子进程完成。

就“即使系统内置了管道功能,也应该找到一段代码”来说,你会在shell程序的代码中找到解释这些特殊shell字符的代码。


mkl*_*nt0 5

您所指的字符是shell运算符,而不是可执行文件(例如,二进制文件,例如/bin/ls,外部实用程序).

也就是说,这些字符指示shell如何协调执行命令(外部公用事业,shell内建,函数,别名)和重定向它们的输入/输出.

  • |是一个shell 控制操作符的实例,它链接管道中多个命令的执行.

  • <并且>是shell 重定向操作符,分别用于重定向stdin输入和stdout输出.

如果您的shell是bash,请咨询man bash,或者更一般地说man $SHELL.