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
字符<,,,不是与诸如 之类的可执行文件相同意义上的>进程。相反,它们是对 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)
将(不一定按此顺序):
grep命令创建一个子进程。grep通过开始命令execve。sort命令创建一个子进程。sort通过开始命令execve。sort子进程完成。就“即使系统内置了管道功能,也应该找到一段代码”来说,你会在shell程序的代码中找到解释这些特殊shell字符的代码。