在 CentOS(以及一般的 Linux shell,如 bash)中,alias(别名)的优先级遵循一定的规则,理解这些规则有助于排查命令“为什么执行的不是我想要的”。
在 bash 里,当你输入一条命令时,shell 大致按以下顺序判断:
⚠️ 注意:
实际上更准确的说法是:
alias > function > builtin > external command
但 alias 只在“交互式 shell + 非引用命令”时生效。
例如:
alias ls='ls --color=auto'
此时你输入:
ls
✅ 实际执行的是:
ls --color=auto
即使 /bin/ls 存在,也不会直接用。
例如:
if、for、while、case
这些不是 alias,也不是 builtin,而是 shell 关键字,优先级比 alias 高。
alias if='echo haha'
if # 仍然是 shell 的 if
shopt -s expand_aliases
'ls' # 不展开 alias
"ls" # 不展开 alias
\ls # 不展开 alias
这是绕过 alias 的常用方法。
alias pwd='echo alias_pwd'
pwd
# 输出 alias_pwd
function pwd() {
echo func_pwd
}
pwd
# 输出 func_pwd(function 覆盖 alias)
unalias pwd
pwd
# 输出 builtin pwd 的结果
type ls
输出示例:
ls is aliased to `ls --color=auto'
alias
\ls
command ls
/bin/ls
/etc/bashrc~/.bashrc加载顺序:
/etc/profile
└── /etc/bashrc
~/.bashrc
后加载的 alias 会覆盖前面的
在 CentOS 的 bash 中:alias 优先级最高,但只影响交互式 shell,且不能覆盖 shell 关键字;用
\命令或command可绕过 alias。
如果你有具体场景(比如 ll、rm、cp 被 alias 了想改),可以贴出来我帮你分析。