bash和其他智能shell如何找到可执行文件?

时间:2016-03-31 19:36:33

标签: linux bash shell unix

他们处理来自PATH的可执行elf,脚本和符号链接,但是这个算法是做什么的? 我害怕我找不到这部分shell的源代码。

UDP:哦,我真是个傻瓜。它在PATH中查找EACH可执行文件,无论是目录还是普通文件。

3 个答案:

答案 0 :(得分:4)

嗯,实际搜索由findcmd.c:553中的find_user_command_in_path()执行。

搜索命令${foo}的算法基本上是:

  • 检查${foo}是绝对的:如果它返回此路径并停止搜索
  • 遍历PATH中的所有元素:for p in ${PATH}
    • 构建路径${p}/${foo}并查看它是否存在
      • 如果存在且可执行,则返回此路径并停止搜索

答案 1 :(得分:0)

我不是这方面的专家,但我几乎完全相信在Linux上,文件权限中的可执行位是最重要的。无需复杂的算法。

答案 2 :(得分:0)

假设我们在当前目录中有一个名为hello的文件,并且该文件只包含一行:echo" hello"

  1. 如果你在文件上运行了chmod 755并且随后执行了该文件,那么bash shell将查看你在.bashrc的PATH变量中列出的每个路径,从第一个路径开始,直到找到包含hello可执行文件的第一个路径。将PATH视为链接列表,并将bash shell视为通过路径的链接列表,路径路径。如果bash shell没有运行你希望它运行的hello可执行文件,你有一个选择:把hello可执行文件放在任何一个前面的路径中。

  2. 我很懒。我不打算把你好打成一个可执行文件,即我没有运行chmod命令,我只是运行

    bash你好

  3. 其中bash shell将在当前目录中查找hello文件,fork一个bash进程,forked bash进程将在forked bash进程终止之前运行hello文件。

    我使用bash shell作为示例,但任何其他shell的行为方式都相同。