Linux which命令允许用户搜索$PATH环境变量中的路径列表,并输出作为参数指定的命令的完整路径。该命令通过查找与给定命令匹配的可执行文件来工作。
如果您想知道指定的程序存储在哪里,那么which命令可以帮助您识别路径,使用起来非常简单。
Linux 中的which命令
which [options] [–] programname […]
上述命令将显示指定文件名或命令的路径。
如果您想知道某个程序的确切位置,只需使用它上面的。which命令在shell的搜索路径中查找可执行文件。假设您想知道pwd命令的可执行文件在哪里,请使用以下命令:
注意,这只适用于可执行文件。因此,您应该只在可以运行的参数中使用它。
which命令-a选项
which命令选项如上。常见的选项为-a,它是可选的,用于打印找到的所有匹配项。
该命令从左到右搜索匹配项。如果在$PATH中列出的目录中找到多个匹配项,则只打印第一个匹配项。-a选项指示打印所有匹配项。
which -a
有多个匹配有时意味着一个匹配是另一个匹配的符号链接。但是,同一命令的两个版本可能位于不同的位置,或者两个不同的命令使用相同的名称。
显示可执行文件的多个路径
通过在单个命令中一次提供多个参数,我们可以显示可执行文件的多个路径。要在命令中传递多个参数,请用空格分隔它们。执行命令如下:
which < command1 > < command2 > < command3 > …
例如,要显示cat、head和mkdir命令的路径,请执行以下命令:
上述命令将在新行中显示所有指定命令的路径.
如果您在使用which 命令时卡住了,可以通过显示which 命令的手册从终端获得帮助。
man which
Linux 中的which命令及C/C++代码实现
int main(int argc, char **argv)
{while ((opt = getopt(argc, argv, "as")) != -1) {switch (opt) {case 'a':allpaths = 1;break;case 's':silent = 1;break;default:usage();break;}}argv += optind;argc -= optind;if (argc == 0)usage();if ((p = getenv("PATH")) == NULL)exit(EXIT_FAILURE);pathlen = strlen(p) + 1;path = (char *)malloc(pathlen);if (path == NULL)err(EXIT_FAILURE, NULL);while (argc > 0) {memcpy(path, p, pathlen);if (strlen(*argv) >= FILENAME_MAX ||print_matches(path, *argv) == -1)status = EXIT_FAILURE;argv++;argc--;}...
}
...
编译运行:
总结
Linux which常用于查找可直接执行的命令。只能查找可执行文件,该命令基本只在$PATH路径中搜索,查找范围最小,查找速度快。