当前位置:首页>Linux>每天学一个Linux命令系列(37):alias - 偷懒的正确方式,别名写起来

每天学一个Linux命令系列(37):alias - 偷懒的正确方式,别名写起来

  • 2026-10-11 06:23:03
每天学一个Linux命令系列(37):alias - 偷懒的正确方式,别名写起来
运
运维少年 · 科技观察

这个命令是干啥的

做运维这行,每天敲重复命令的时间比你想的多得多。比如 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 查看你定义的所有别名

做到之后,把你的别名列表截图或贴出来看看,互相借鉴一下好用的别名。

E N D

运维少年 · 科技观察

最新文章

随机文章