跳到主要内容

Linux 命令的查找与执行优先级

环境变量​

环境变量是操作系统中保存的一组键值对(key=value),用于存放系统或程序运行时需要的配置信息,例如用户主目录、语言设置、可执行文件搜索路径。进程创建时会继承父进程的环境变量。

echo $PATH          # 查看单个变量
export MY_VAR=value # 设置/导出变量
env # 查看全部环境变量
printenv MY_VAR # 查看某个变量
unset MY_VAR # 删除变量

PATH 的作用​

PATH 存放一串用冒号分隔的目录路径:

/usr/local/bin:/usr/bin:/bin:/sbin

当输入一个命令(如 ls)时,Shell 会按顺序在 PATH 列出的目录中查找同名可执行文件,找到就执行,找不到就报 command not found。

$ which ls
/bin/ls

说明 ls 实际是 /bin/ls,因为 /bin 在 PATH 中,所以直接输入 ls 就能找到。

这也是为什么自己安装的程序如果不在 PATH 目录下,就必须用完整路径(如 ./myprogram)运行,或者手动把它的目录加入 PATH。

命令执行优先级(从高到低)​

优先级类型说明示例
1别名 alias用户自定义的命令简写alias ll='ls -l'
2关键字 / 保留字 KeywordShell 语法中的保留词if、for、while、do、done
3函数 FunctionShell 中自定义的函数myfunc() { echo hello; }
4内建命令 BuiltinShell 自带,无需外部程序cd、echo、export、pwd、read
5外部命令 External磁盘上通过 PATH 查找到的可执行文件,需 fork 新进程/bin/ls、/usr/bin/grep

查看命令类型​

type ls        # 判断属于哪种命令
type -a echo # 查看该命令名在各优先级下是否都存在

为什么要定优先级​

当命令名重复时(例如自定义了一个叫 ls 的别名),Shell 需要按固定顺序判断该执行哪一个,避免歧义。这也是为什么内建命令(如 cd)不会被同名的外部程序覆盖执行逻辑——内建命令的优先级高于外部命令。