当你在 Bash 里敲下一个命令后,系统到底先去找哪一份“可执行文件”来运行。
把它想象成一个“优先级排行榜”,系统会按顺序逐一检查,一旦找到就停住,不再往后看。

举个例子:
你在终端里敲了
ls
系统会按下面的顺序去“找人”:
1️⃣ 第一顺位:绝对/相对路径
- 如果你写的是完整路径,系统直接执行这个路径下的文件,不查别的。
例:
这种写法“指名道姓”,优先级最高。/bin/ls # 绝对路径 ./myscript.sh # 相对路径(当前目录下的文件)
2️⃣ 第二顺位:别名(alias)
- 如果命令不是路径形式,系统会先看看你有没有给这个命令起“外号”。
例:
此时敲alias ls='ls --color=auto'ls,实际执行的是ls --color=auto,而不是原始的/bin/ls。
只有没找到别名,才继续往下。
3️⃣ 第三顺位:Bash 内部命令(built-in)
- Bash 自己自带了一些命令,叫“内部命令”。
例:cd、echo、pwd、history等。
如果命令既不是路径,也没被 alias 覆盖,Bash 会看看是不是自己“亲儿子”,是就直接执行,不再去硬盘里找。
4️⃣ 第四顺位:$PATH 目录里找外部程序
- 如果前面都没找到,Bash 会到
$PATH变量列出的所有目录里,按顺序查找同名的可执行文件。
例:
它会先去echo $PATH # 输出可能是:/usr/local/bin:/usr/bin:/bin/usr/local/bin找有没有叫ls的文件,没有再去/usr/bin,再去/bin,直到找到第一个就停。
一张图总结优先级(从高到低):
┌────────────────────────────┐
│ 1. 绝对/相对路径 │ ← 直接执行指定文件
├────────────────────────────┤
│ 2. 别名 alias │ ← 用户自定义的“外号”
├────────────────────────────┤
│ 3. Bash 内部命令 │ ← cd、echo、pwd 等
├────────────────────────────┤
│ 4. $PATH 目录中的外部程序 │ ← 去 /usr/bin、/bin 等找
└────────────────────────────┘
小实验验证:
# 1. 创建一个假的 ls
echo 'echo "I am fake ls"' > /tmp/ls
chmod +x /tmp/ls
# 2. 用不同方式调用
/tmp/ls # 第一顺位:直接执行 /tmp/ls
alias ls='/tmp/ls'
ls # 第二顺位:执行 alias 指向的 /tmp/ls
unalias ls
ls # 第四顺位:执行 /bin/ls(PATH 中找到的)
一句话总结:
路径优先 → 别名其次 → 内部命令再其次 → 最后去 PATH 里找。
本文由mdnice多平台发布