Shell命令的执行顺序

当你在 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 自己自带了一些命令,叫“内部命令”。
    例:cdechopwdhistory 等。
    如果命令既不是路径,也没被 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多平台发布

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容