![仅给出将要运行的程序的名称,Unix 如何知道它的绝对路径?](https://linux22.com/image/183986/%E4%BB%85%E7%BB%99%E5%87%BA%E5%B0%86%E8%A6%81%E8%BF%90%E8%A1%8C%E7%9A%84%E7%A8%8B%E5%BA%8F%E7%9A%84%E5%90%8D%E7%A7%B0%EF%BC%8CUnix%20%E5%A6%82%E4%BD%95%E7%9F%A5%E9%81%93%E5%AE%83%E7%9A%84%E7%BB%9D%E5%AF%B9%E8%B7%AF%E5%BE%84%EF%BC%9F.png)
我假设它与创建要运行的程序时有关,它与创建它的工作目录相关联?
答案1
假设您在没有完整路径或相对路径的情况下调用程序,并且该程序不是函数或内置程序,则它必须位于您的 PATH 环境变量中才能找到。
Bash 使用哈希表来记住可执行文件的完整路径名,以避免多次 PATH 搜索(请参阅 Bourne Shell 内置函数中对哈希的描述)。仅当在哈希表中未找到该命令时,才会对 $PATH 中的目录执行完整搜索。如果搜索不成功,shell 将搜索名为 command_not_found_handle 的已定义 shell 函数。如果该函数存在,则会在单独的执行环境中调用它,并使用原始命令和原始命令的参数作为其参数,并且该函数的退出状态将成为该子 shell 的退出状态。如果未定义该函数,shell 将打印一条错误消息并返回退出状态 127。
答案2
当执行程序时,调用程序(通常是 shell)按照惯例在PATH
环境变量中列出的目录中搜索该程序。为此,调用程序可以使用execlp
、execvp
、 或等库函数execvpe
来执行搜索,或者调用程序本身可以实现类似的逻辑。
库函数最终调用execve
系统调用,这是实际执行程序的主力。该execve
调用将文件名作为第一个参数,它是包含程序的文件的名称。该名称通常是文件的绝对路径,但也可以是相对路径。在这种情况下,文件的搜索是从进程的当前目录开始的。 (请注意,该文件不一定包含在当前目录中:例如,名称可以是 。../../myprogram
)execve
系统调用不关心PATH
环境变量。
那么,如果给系统调用一个相对路径,内核如何知道程序的绝对路径呢execve
?答案是不会,也没有必要。