非内置命令和 $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
。
一开始我不得不提到我是 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
。