内置的shell命令“类型”如何知道给定命令的路径?

时间:2019-03-28 23:11:13

标签: linux shell

内置shell命令type如何知道给定命令的路径。 Shell是否具有用于最常用命令的表,其中包含这些命令的路径,或者Shell在系统中搜索这些命令?

2 个答案:

答案 0 :(得分:3)

大多数shell会以以下方式尝试查找您输入的程序:

  1. 检查程序实际上是已定义的函数还是别名
  2. 检查程序是否实际上是内置的shell
  3. 遍历$PATH环境变量中的目录,以:分隔
  4. 如果什么也找不到失败

使用以下命令显示用于匹配的目录列表:

echo "$PATH" | sed 's/:/\n/g'

大多数shell还会散列已经找到的程序的路径,如果在散列匹配之后移动程序,则可能导致问题。有关更多信息,请参见John1024's answer

答案 1 :(得分:0)

bash shell保留在路径中已经找到的程序的哈希表。内置type会检查名称,以查看它是别名,shell保留字,函数,内置文件还是磁盘文件。如果都不是,则检查哈希表:

/* If the user isn't doing "-a", then we might care about
   whether the file is present in our hash table. */
if (all == 0 || (dflags & CDESC_FORCE_PATH))
    {
        if (full_path = phash_search (command))
            {
                if (dflags & CDESC_TYPE)
                    puts ("file");
                else if (dflags & CDESC_SHORTDESC)
                    printf (_("%s is hashed (%s)\n"), command, full_path);
                else if (dflags & (CDESC_REUSABLE|CDESC_PATH_ONLY))
                    printf ("%s\n", full_path);

                free (full_path);
                return (1);
            }
    }

如果找不到其他名称,它将搜索路径:

/* Now search through $PATH. */
while (1)

您可以使用类似

的方法强制shell忘记哈希表。
$ hash -r

推荐阅读:bash source code for the type built-in