非内置命令和 $PATH

Non builtin command and $PATH

一开始我不得不提到我是 linux 中的新手。 我必须证明,当您使用非内置命令(例如 cat 时),linux 正在 $PATH 中搜索可执行文件,并且在找到一个后,它将不再搜索。有什么方法可以做到这一点,而不是通过 cp 其他命令并更改它的名称或制作具有相同名称的全新脚本?

您可以使用 strace 检查进程进行的系统调用。

 $ strace bash -c 'cat /dev/null' 2>&1 | grep cat
execve("/usr/bin/bash", ["bash", "-c", "cat /dev/null"], 0x7ffcc25e5ab0 /* 91 vars */) = 0
stat("/usr/local/bin/cat", 0x7fff874b7150) = -1 ENOENT (No such file or directory)
stat("/usr/bin/cat", {st_mode=S_IFREG|0755, st_size=39112, ...}) = 0
newfstatat(AT_FDCWD, "/usr/bin/cat", {st_mode=S_IFREG|0755, st_size=39112, ...}, 0) = 0
access("/usr/bin/cat", X_OK)            = 0
newfstatat(AT_FDCWD, "/usr/bin/cat", {st_mode=S_IFREG|0755, st_size=39112, ...}, 0) = 0
access("/usr/bin/cat", R_OK)            = 0
stat("/usr/bin/cat", {st_mode=S_IFREG|0755, st_size=39112, ...}) = 0
newfstatat(AT_FDCWD, "/usr/bin/cat", {st_mode=S_IFREG|0755, st_size=39112, ...}, 0) = 0
access("/usr/bin/cat", X_OK)            = 0
newfstatat(AT_FDCWD, "/usr/bin/cat", {st_mode=S_IFREG|0755, st_size=39112, ...}, 0) = 0
access("/usr/bin/cat", R_OK)            = 0
execve("/usr/bin/cat", ["cat", "/dev/null"], 0x561cafdde4f0 /* 91 vars */) = 0

就我而言,bash 尝试先 /usr/local/bin/cat,然后打开 /usr/bin/cat