alias 命令仅在当前终端会话生效,永久生效需写入对应 shell 的初始化文件(如 bash 写 ~/.bashrc,zsh 写 ~/.zshrc),并执行 source 命令重载配置。

alias 命令只在当前终端生效,关掉就没了
你输 alias ll='ls -la' 确实能用,但新开一个终端或登出重进,ll 就报“command not found”。因为 alias 默认只作用于当前 shell 进程,不持久。
真正要永久生效,得把 alias 写进 shell 的初始化文件里。具体写哪,取决于你用的是什么 shell:
- 大多数 Linux 发行版默认是
bash→ 改~/.bashrc - Ubuntu 20.04+ 或 macOS Catalina 后默认是
zsh→ 改~/.zshrc - 不确定自己用啥?运行
echo $SHELL看输出路径,或者ps -p $$查当前进程名
写进 .bashrc 或 .zshrc 后还不生效?别忘了重载
改完配置文件只是“存好了”,shell 不会自动重新读取。必须手动触发加载,否则 alias 还是没注册。
执行这行命令立即生效:source ~/.bashrc(或 source ~/.zshrc)。注意不是 ./.bashrc,也不是重启终端——虽然重启也行,但没必要。
- 如果提示
command not found: source,说明你用的是dash或其他极简 shell,此时换用. ~/.bashrc(英文句点 + 空格 + 路径) - 想让所有新打开的终端都自动生效,确保该配置文件末尾没有
return或exit提前中断执行 - 某些桌面环境(如 GNOME)启动终端时不读
.bashrc,而是读.profile,这时可以把 alias 行挪过去,或在.profile里加source ~/.bashrc
别名里带参数或管道?直接 alias 不行,得用函数
alias gs='git status' 没问题,但 alias greplog='grep 'error' /var/log/syslog' 会失败——单引号被 shell 提前解析,实际执行时变成空字符串。更麻烦的是想传参,比如 ll /tmp 要能转发参数给 ls -la。
这时候必须改用 shell 函数,它天然支持参数和复杂逻辑:
gs() {
git status "$@"
}
greplog() {
grep 'error' /var/log/syslog "$@"
}
函数定义同样写进 .bashrc 或 .zshrc,然后 source 加载。注意 "$@" 是关键,它原样转发所有参数,避免空格、通配符等被错误拆分。
别名冲突或覆盖系统命令?检查优先级和拼写
定义 alias cd='cd -P' 看似合理,但万一某天你依赖 cd 的原始行为(比如软链接跳转),反而会出问题。更常见的是手误拼错,比如 alias la='ls -alh' 写成 alias la='ls -ahl'——参数顺序错导致报错,但 alias 本身不报错,只有执行时才暴露。
- 查已定义的 alias:运行
alias(不带参数)列出全部;查某个:用type ll或command -v ll - 临时绕过 alias 执行原命令:加反斜杠,如
\ls;或用全路径/bin/ls - 删除某个 alias:用
unalias ll,但仅对当前会话有效 - 别名不能嵌套调用另一个 alias,比如
alias ll='ls -l'; alias la='ll -a'会失败,la找不到ll命令
最常被忽略的一点:不同 shell 的配置文件可能互相干扰。比如你在 .zshrc 里写了 alias,却用 bash 启动脚本,那 alias 根本不加载。别假设“我设了,就到处都能用”。










