news 2026/9/17 8:39:50

在 Bash 中创建自定义命令与别名(Alias)实战指南——以 introduction-to-bash-scripting 开源电子书第 14 章为例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在 Bash 中创建自定义命令与别名(Alias)实战指南——以 introduction-to-bash-scripting 开源电子书第 14 章为例

在 Bash 中创建自定义命令与别名(Alias)实战指南——以 introduction-to-bash-scripting 开源电子书第 14 章为例

【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting

introduction-to-bash-scripting这本开源 Bash 脚本入门电子书中,第 14 章专门讲解了如何把冗长、高频使用的终端命令封装成简短的自定义命令(即别名 alias)。本文以该章节(西班牙语版 ebook/es/content/014-creating-custom-bash-commands.md,英文原版见 ebook/en/content/014-creating-custom-bash-commands.md)为骨架,结合仓库中的配套脚本与相关章节,系统讲解别名的创建、持久化、管理与排查,并对比函数与/usr/bin脚本等替代方案。读完本文,你将能够把日常最耗时的长命令压缩为一句易记的短命令,并在重启、重新登录后依然生效。

为什么需要自定义命令

作为开发者或系统管理员,大量时间都花在终端里。面对反复出现的任务,最自然的优化思路就是:把又长又难记的命令封装成短命令。电子书原文档给出的做法有两种:编写短小的 Bash 脚本,或创建自定义命令——也就是别名(alias)。

别名的核心价值在于:不用每次重复输入一长串管道、选项和参数,只需敲一个精心设计的短单词即可得到完全相同的结果。这在故障排查场景中尤其有用,因为它能显著缩短"获取信息"的等待时间。

实战示例:一键统计 Web 服务器的 80/443 端口连接数

原文档以一个非常贴近真实运维的场景开场:系统管理员经常需要检查 Web 服务器的连接状况,尤其是端口 80(HTTP)与 443(HTTPS)上是否存在服务监听、当前有多少连接。

首先是一个"原始长命令":

netstat -plant | grep '80\|443' | grep -v LISTEN | wc -l

逐段拆解这个命令的作用:

  • netstat -plant:列出所有 TCP 连接及监听端口(-p显示进程、-l显示监听、-a显示所有、-n数字显示、-t限定 TCP);
  • grep '80\|443':用扩展正则的备选匹配(BRE 下的\|)过滤出包含 80 或 443 的行;
  • grep -v LISTEN:排除处于 LISTEN 状态的监听连接,只保留真正的活跃连接;
  • wc -l:统计行数,即连接总数。

这个命令本身没有任何问题,但每次排障时都重新敲一遍,长期来看非常浪费时间。原文档指出:当你需要快速拿到这类信息时,这种重复输入尤其低效。

用 alias 创建短命令

为了避免反复输入,我们创建一个别名。以原文档为例:我们希望输入conx(西班牙语版用的是 connections 的缩写,英文原版中对应为conn)就能拿到同样的结果。只需执行:

alias conx="netstat -plant | grep '80\|443' | grep -v LISTEN | wc -l"

执行后,conx就成了那条长netstat管道的"快捷键"。现在直接运行:

conx

会得到与长命令完全一致的输出。alias是 Bash 内建命令,它的基本语法是alias 名称="命令串",定义时右侧的值会被整体保存,等号两边不能有空格。

让命令输出更友好

别名还可以做得更"人性化"——原文档展示了如何在结果前加上提示信息,用分号把多条命令串在一起:

alias conx="echo 'Total de conexiones en los puertos 80 y 443:' ; netstat -plant | grep '80\|443' | grep -v LISTEN | wc -l"

此时运行conx的输出为:

Total de conexiones en los puertos 80 y 443: 12

这种写法体现了别名的一个关键特性:别名值本质是一段可执行的命令文本,因此你可以在其中自由组合echo、分号、管道等任意 Bash 语法,相当于为某类操作定制了一个"带说明的输出模板"。

让别名永久生效:写入 shell 配置文件

原文档特别提醒了一个新手常踩的坑:在终端里临时定义的别名,一旦注销或重启就会丢失。因为交互式 shell 中的alias只对当前 shell 会话生效。

要让改动持久化,需要把alias命令写进 shell 的配置文件。原文档给出了两条路径:

  • Ubuntu 等发行版默认使用~/.bashrc
  • 其他操作系统可能使用~/.bash_profile

用你喜欢的编辑器打开文件(文档示例用nano):

nano ~/.bashrc

跳到文件末尾,追加下面这行:

alias conx="echo 'Total de conexiones en los puertos 80 y 443:' ; netstat -plant | grep '80\|443' | grep -v LISTEN | wc -l"

保存并退出后,即便注销再重新登录,conx也会一直可用。补充一个文档未展开但非常实用的细节:如果你不想注销,也可以在当前会话立即生效:

source ~/.bashrc # 或使用 Bash 的点号简写 . ~/.bashrc

关于.bashrc.bash_profile的选择,可以补充说明:登录式 shell(如 SSH 登录)通常读取~/.bash_profile,而交互式非登录 shell(如打开新的终端窗口)读取~/.bashrc。如果你的自定义命令在两个场景都要可用,可以两条路径都配置,或在.bash_profile中显式source ~/.bashrc。这属于发行版差异,需结合你实际环境确认。

查看当前 shell 中所有别名

当系统行为出现异常时,排查的第一步往往是看看当前环境里到底定义了哪些别名。运行:

alias

即可列出当前 shell 中所有可用的别名及其展开值。原文档指出:当某些命令表现出奇怪行为时,这个命令特别有用——例如,可能某个命令早已被别名覆盖成了别的版本,而你并不知情。

与排查相关的补充命令还包括:

  • unalias conx:删除指定的别名;
  • type conx:查看conx到底是别名、函数、内建命令还是外部程序,是判断"谁劫持了命令"的有力工具。

这些命令都属于 Bash 对别名机制的配套管理能力,可以在你的 shell 中直接验证。

别名的引号与转义细节

为了让别名真正"可复制、可运行",有几个易错点值得注意:

  • 整个命令串要放在双引号中,这样其中的单引号(如echo '...')不会被提前解释;
  • 如果命令串内部还需要双引号,则应整体改用单引号包裹,或对内部双引号进行转义;
  • 别名展开发生在命令解析的早期阶段,因此别名的值里不能再递归地引用同名别名,否则会造成无限展开;
  • 如果命令串包含变量,注意区分定义时展开(双引号)与执行时展开——这正是别名和函数行为差异的一个体现。

替代方案对比:Bash 函数与 /usr/bin 脚本

原文档在结论部分坦诚地指出了别名的局限与另一种思路:你也可以编写一个 Bash 脚本,把它放进/usr/bin目录,从而获得一个"系统级命令"。但这样做需要 root 或 sudo 权限,而别名完全不需要任何权限,普通用户即可定义和使用——这是别名相对脚本方案的最大优势。

在能力边界上,还有第三种方案:Bash 函数。电子书第 12 章 ebook/en/content/012-bash-functions.md 详细介绍了函数的定义方式:

function nombre_de_la_funcion() { comandos }

与别名相比,函数支持参数传递(函数内通过$1$2访问)、局部变量和更复杂的逻辑控制,适合封装"需要入参"的自定义命令;别名则更适合"固定命令串"的纯快捷键场景。实战中的常见做法是:简单替代用别名,需要参数和逻辑时升级为函数,需要跨机器分发、全局可用时再考虑写成脚本放到 PATH 中。

仓库配套:用 shellcheck 保证命令质量

值得一提的是,本仓库为所有章节的 Bash 代码块配备了静态检查脚本 scripts/shellcheck-ebook.sh。该脚本会从电子书的 Markdown 文件中提取所有 ```bash 代码块,为每个代码块临时补上 shebang,然后逐一执行shellcheck校验,并特意排除了SC2034(变量看似未使用)、SC2154(变量未赋值即引用)等适合教学片段的规则,最后汇总报告有多少代码块通过校验。

这意味着:包括本章在内,电子书中出现的每一条命令都经过 shellcheck 的静态检查。对读者而言,这也是一条可复用的工作流建议——写完自己的别名或脚本后,可以用 shellcheck 快速发现引号、空格、管道等常见陷阱;更详细的调试技巧(如bash -xset -x与终端快捷键)可参考第 13 章 ebook/en/content/013-debugging-and-testing.md。

小结

通过本仓库第 14 章的学习,我们掌握了自定义 Bash 命令的完整套路:

  1. 识别高频长命令,用alias 短名="长命令"在会话内快速创建快捷键;
  2. 在别名中组合echo、分号与管道,让输出更直观;
  3. alias写入~/.bashrc(或~/.bash_profile)实现永久生效,并用source ~/.bashrc即时加载;
  4. aliasunaliastype管理并排查别名;
  5. 根据是否需要参数与权限,在"别名 → 函数 → PATH 脚本"三者间做出合适的选择。

正如原文档所说,这是创建自定义 Bash 命令的一种方式——无需 root 权限,零门槛,却能显著压缩重复劳动,值得纳入每一位开发者与运维工程师的日常工具箱。

【免费下载链接】introduction-to-bash-scriptingFree Introduction to Bash Scripting eBook项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-bash-scripting

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 8:39:04

嵌入式Linux学习路线:从单片机裸机到驱动开发完整爬坡路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/17 8:38:30

MATLAB热网建模:MILP框架下的线性化优化实践

1. 项目背景与核心价值在能源系统优化领域,多区域综合能源系统(Integrated Energy System, IES)的热网建模一直是个棘手问题。传统热网模型要么过于简化导致精度不足,要么过于复杂难以求解。这个MATLAB项目通过创新的线性化处理方法,在模型精…

作者头像 李华
网站建设 2026/9/17 8:37:48

OpenMontage不是视频剪辑软件:科研工作流协议解析与工程落地

1. OpenMontage不是“开源版Premiere”,它本质是一个被严重误读的学术原型系统OpenMontage 这个名字一出来,很多人第一反应是:“哦,又一个开源视频剪辑软件?是不是能替代DaVinci Resolve或者Shotcut?”——…

作者头像 李华
网站建设 2026/9/17 8:37:46

DeskcommCRM深度解析:从沟通优先到落地实践

开头可以不写主标题,直接以正文内容开始。为了阅读体验清晰,我会用一个H2作为开头的“引入”吗?不对,规则是开头不需要单独标题,直接从段落开始,然后主体用H2。让我设计好结构再输出。说实话,第…

作者头像 李华
网站建设 2026/9/17 8:37:11

AI+图谱+智能代理:渗透测试自动化架构解析

1. “Pentagi”不是产品名,而是渗透测试AI代理架构的代号级命名现象最近在几个红队技术群和CTF复盘分享里,频繁看到有人提到“pentagi”——不是某个开源项目仓库名,也不是PyPI上可pip install的包,更不是Docker Hub里的官方镜像标…

作者头像 李华
网站建设 2026/9/17 8:37:01

VS与VS Code断点不生效排查指南:从原理到实战

要说调试里最让人血压升高的事,“F9打好断点,F5一跑,程序直接跑完”绝对排前三。明明代码逻辑看着没问题,想断下来看个变量的值,结果红点要么空心、要么被无视,尤其排查偶发问题的时候,这种“进…

作者头像 李华