这个命令是干啥的
做运维这行,每天敲重复命令的时间比你想的多得多。比如 ls -la 一天敲几十次,cd /var/log/nginx 这种长路径每次打一遍,还有 docker compose ps 这种记不全的参数组合。
刚开始我老老实实全拼,后来发现老同事敲命令飞快,一问才知道用了 alias(别名)。简单说,就是给命令起个小名。你叫它"小名",shell就执行"大名"对应的命令。
alias 本身是shell内建命令,不是外部程序。它的核心思想就一个:别让你的手指做重复劳动。
基本用法(3分钟上手)
定义别名
# 定义别名 ll,执行 ls -la
alias ll='ls -la'
测试一下,敲 ll 看看效果,等于你执行了 ls -la。
# 定义别名来进入常用目录
alias log='cd /var/log/nginx'
# 定义别名简化docker操作
alias dps='docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"'
查看所有已定义的别名
# 列出当前shell里所有别名
alias
输出大概长这样:
alias ll='ls -la'
alias log='cd /var/log/nginx'
alias grep='grep --color=auto'
alias rm='rm -i'
删除别名
# 删除某个别名
unalias ll
# 删除所有别名
unalias -a
临时跳过别名
有时候你定义了 alias rm='rm -i',但某个场景不想确认,想直接删:
# 反斜杠跳过别名,执行原始命令
\rm -rf /tmp/test
# 或者用 command 命令
command rm -rf /tmp/test
进阶骚操作
永久别名写入 .bashrc
临时 alias 只在当前shell生效,关掉终端就没了。想长久保留,得写到配置里:
# 编辑 ~/.bashrc,把你的别名加进去
vim ~/.bashrc
举例,在文件末尾加一段你自己的别名:
# 我的常用别名
alias ll='ls -la'
alias la='ls -A'
alias l='ls -CF'
alias grep='grep --color=auto'
alias df='df -h'
alias du='du -sh'
alias cls='clear'
alias ..='cd ..'
alias ...='cd ../..'
alias dc='docker compose'
alias dcu='docker compose up -d'
alias dcd='docker compose down'
alias dcl='docker compose logs -f'
写完要让它生效:
# 重新加载 ~/.bashrc
source ~/.bashrc
# 或者更省事,重新登录
覆盖原生命令(安全版)
把有危险的原生命令加上保护:
# cp、mv、rm 加 -i 交互确认,防止手滑
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -i'
我刚开始做运维时觉得 rm -i 太烦了,关掉了。然后有一次想删 test*,结果 * 没转义,直接把当前目录清空了。从那以后 alias rm='rm -i' 就是我每台机器的标配。
别名带参数(用函数)
alias 有个很大的限制:它只能把参数拼到命令结尾,没法在中间插参数。比如你想写个别名,让 mkcd project 等于 mkdir project && cd project,普通的 alias 做不到。
解决办法是用shell函数:
# 定义函数,创建目录并进入
mkcd() {
mkdir -p "$1" && cd "$1"
}
# 同样的,也一起写进 ~/.bashrc
用起来:
# 创建 test-dir 并直接进入
mkcd test-dir
实用别名推荐
我每台服务器都有的标配别名:
# 系统信息快速查看
alias myip='curl -s ip.sb'
alias ports='netstat -tulanp'
alias cpu='lscpu | head -20'
alias mem='free -h'
alias disk='df -h | grep -v tmpfs'
# git 相关
alias gs='git status'
alias ga='git add'
alias gc='git commit -m'
alias gp='git push'
alias gl='git log --oneline --graph'
# 网络工具
alias ping='ping -c 4'
alias myping='ping baidu.com -c 4'
# 快速创建备份
alias bak='cp "$1" "$1".bak'
注意上面最后那个 bak 其实用函数更好,因为参数要在中间:
# 用函数实现备份:cp file file.bak
bak() {
cp "$1" "$1.bak"
}
避坑指南
坑1:别覆盖系统重要命令
有次同事把 alias ls='cd' 写进了全局配置,结果所有用户的 ls 都变成 cd 了。整个部门炸锅了一上午才发现。
还有更坑的:alias sudo='sudo ' (注意末尾有空格)。这个比较隐蔽,加了空格会让 sudo 后面的命令也展开别名,不加就不会。比如:
# 没有空格:sudo ll 不会展开 ll 别名
alias sudo='sudo'
# 有空格:sudo ll 会先展开 ll 再执行
alias sudo='sudo '
坑2:别名在非交互式shell里不生效
写脚本时,脚本里的 ll 不会自动展开成 ls -la,因为脚本运行在非交互式shell中,不读 ~/.bashrc。
如果脚本里确实想用别名,要么手动 source 配置,要么老老实实写全命令:
#!/bin/bash
# 手动开启别名扩展
shopt -s expand_aliases
source ~/.bashrc
ll # 现在可以用了
坑3:别名递归导致死循环
# 别这么写,会无限递归
alias ls='ls -la'
实际上shell对别名递归有保护,直接报错,不会真的死循环。但函数递归是真的会死的:
# 函数自己调用自己,会递归到资源耗尽
ls() {
ls -la # 这里调用的是函数自己,不是外部命令
}
正确写法是在函数里调用外部命令,用 command:
# 安全写法
ls() {
command ls -la --color=auto "$@"
}
坑4:SSH会话别名不继承
通过SSH远程执行命令时,如果目标机器没有配置别名,那你本地的别名在远程机器上不生效。比如:
# 本地定义的 log 别名
alias log='cd /var/log'
# SSH过去执行会报错
ssh server01 log
# 输出:bash: log: command not found
解决办法:要么在远程机器的 ~/.bashrc 里也配相同的别名,要么把别名写到 ~/.ssh/environment(还需要开启 PermitUserEnvironment)。
实战场景(重点!结合真实运维场景)
场景1:运维工具箱
我维护的每个项目目录里,都会放个 .aliases.sh:
#!/bin/bash
# 项目专用别名
alias prd='ssh deploy@prod-server'
alias dev='ssh deploy@dev-server'
alias deploy='./deploy.sh'
alias log-api='tail -f /var/log/api/current.log'
alias log-web='tail -f /var/log/web/error.log'
alias restart='sudo systemctl restart api-web'
alias dbcon='mysql -h db.internal -u admin -p'
然后在项目目录下 source .aliases.sh,立马获得项目专属的快捷命令。
场景2:日常巡检别名集
每天巡检服务器的重复劳动,用别名一键搞定:
# 放到 ~/.bashrc 里
alias checkload='uptime && echo "---" && free -h && echo "---" && df -h'
alias checknginx='nginx -t && systemctl status nginx --no-pager'
alias checkcon='ss -s && echo "---" && netstat -an | wc -l'
alias checklog='journalctl -p err -n 20 --no-pager'
早上一来,逐个敲就行了,不用再一个命令一个命令地敲。
场景3:kubectl 别名
做K8s运维的,kubectl 命令巨长,没有别名简直没法干活:
alias k='kubectl'
alias kg='kubectl get'
alias kd='kubectl describe'
alias kl='kubectl logs -f'
alias kx='kubectl exec -it'
alias kgp='kubectl get pods'
alias kgs='kubectl get svc'
alias kgn='kubectl get nodes'
alias kga='kubectl get all --all-namespaces'
配合 --all-namespaces 缩写更爽:
alias kgaa='kubectl get all --all-namespaces'
场景4:用别名覆盖危险命令
最经典的是覆盖 rm,还可以拦截危险操作:
# 提示确认
alias poweroff='echo "你确定?再用 sudo poweroff"'
alias reboot='echo "要重启吗?确认后执行 sudo /sbin/reboot"'
# 真正的重启我倾向于完整命令
alias reboot-server='sudo /sbin/reboot'
今日作业
1. 打开你的 ~/.bashrc,添加至少5个你认为最实用的别名
2. 用 source ~/.bashrc 让它们生效
3. 定义一个函数别名 mkcd(创建目录并进入)
4. 执行 alias 查看你定义的所有别名
做到之后,把你的别名列表截图或贴出来看看,互相借鉴一下好用的别名。