alias无法展开变量,应改用函数;zsh可用cdspell和auto_cd;cd-与pushd/popd用于目录切换;配置需source生效。

alias 不能直接 cd 到变量路径,得用函数
很多人试过 alias gohome='cd /var/www/project' 能用,但换成 alias go='cd $HOME/myapp' 就失效——因为 alias 展开时 $HOME 不被求值。shell 在定义 alias 时只做字面替换,不执行变量展开或命令替换。
真正可靠的方式是用 shell 函数:
gohome() {
cd /var/www/project
}
myapp() {
cd "$HOME/myapp"
}函数里能用变量、条件判断、甚至参数,cd 后还能加 ls 或 git status;alias 做不到这点。
- 别在 alias 里写带变量或命令替换的路径,比如
alias ll='ls -la $(pwd)'—— 这会固定成定义时的路径 - 函数名不用加
function关键字,bash/zsh 都支持简写语法 - 记得用双引号包裹
"$HOME",避免路径含空格时报错
zsh 用户优先用 cdspell 和 auto_cd
zsh 自带两个实用功能:拼写自动纠正(cdspell)和省略 cd 命令(auto_cd)。开启后,输入 /hoem 会被自动纠正为 /home;输入 ~/Downloads 直接跳转,不用敲 cd。
启用方式很简单,在 ~/.zshrc 里加两行:
setopt cdspell setopt auto_cd
注意:auto_cd 对纯路径生效,对别名或函数无效;cdspell 只修正常见拼错(如 libary → library),不会猜你本意是 /opt/myproject。
- 这两个选项 bash 不原生支持,硬要实现得靠复杂补全脚本,不推荐
- 开启
auto_cd后,如果某个目录名恰好和命令同名(比如有个叫ls的子目录),会优先进目录而非执行ls命令
cd - 和 pushd/popd 不是别名,但比别名更实用
别名解决的是「去哪」,而 cd - 和 pushd/popd 解决的是「来回」。它们是 shell 内置机制,无需配置,即装即用。
cd - 切换回上一个工作目录;pushd /tmp 把当前路径压栈并跳转;popd 弹出栈顶并返回——适合在多个项目间频繁切换。
-
pushd默认会显示目录栈,用dirs -v查看全部层级 -
pushd +1表示切换到栈中第 2 个位置(索引从 0 开始) - 这些命令在 bash/zsh 中行为一致,但某些旧版 dash/sh 不支持
pushd
别名持久化必须 reload 或重启 shell
在 ~/.bashrc 或 ~/.zshrc 里加了 alias 或函数后,当前终端不会立刻生效。常见错误是改完文件就直接试命令,结果提示 command not found。
正确做法是运行 source ~/.bashrc(bash)或 source ~/.zshrc(zsh);或者新开一个终端窗口。
- 别用
exec bash或exec zsh来“重启”,它会丢掉当前 shell 的环境变量和历史记录 - 如果 alias 定义在
/etc/bash.bashrc这类系统级文件里,普通用户可能无权修改,优先改自己家目录下的 rc 文件 - macOS Catalina 及以后默认用 zsh,但如果你手动切回 bash,
~/.bash_profile才是主配置文件,不是~/.bashrc
实际用起来,函数 + cd - + pushd 组合覆盖了 90% 的路径跳转需求。真正卡住人的往往不是怎么写,而是变量没引号、rc 文件没重载、或者误以为 alias 能执行逻辑。










