如何在Bash脚本中引入alias

简介: 如何在Bash脚本中引入alias

alias的使用


在日常开发中,为了提高运维效率,我们会用alias(命令别名)来定义命令的简称。比如在~/.bash_profile中添加:


alias ll='ls -lrt --color'
alias bdebug="go build -gcflags '-N -l'"
alias py3='/usr/bin/python3'


执行source ~/.bash_profile之后,这些alias定义便载入到当前终端环境中,我们可以通过alias <cmd>进行查看


$ alias ll 
ll='ls -lrt --color'
$ alias bdebug
bdebug='go build -gcflags '\''-N -l'\'


在命令行执行alias也能看到预期效果


$ ll 
total 44
-rw-rw-r-- 1 liyang liyang   62 Sep 16 09:38 test.c
-rw-rw-r-- 1 liyang liyang   68 Sep 16 09:38 foo.h
-rw-rw-r-- 1 liyang liyang   74 Sep 16 09:38 foo.c
-rwxrwxr-x 1 liyang liyang 8592 Sep 16 09:44 libfoo.so
-rw-rw-r-- 1 liyang liyang 4347 Sep 16 09:44 o23.s
-rwxrwxr-x 1 liyang liyang 9451 Sep 16 09:45 test




在Bash脚本中引入alias的问题


但是有些时候,我们希望将~/.bash_profile中定义好的alias引入Bash脚本中,以便简化命令。例如


脚本文件test.sh


#!/bin/bash
source ~/.bash_profile
ll


执行test.sh文件却会报错


$ bash test.sh 
test.sh: line 5: ll: command not found


这是因为在Bash中,alias默认是不能引入Bash脚本中的。Bash的官方文档其实更建议你使用function而非alias。那么问题来了,既然我辛辛苦苦写了这么多alias,总不能全部改成function吧,那得多费劲?


幸好,解决方法还是有的.




解决方法


只需要在test.sh中加入一行shopt -s expand_aliases

新的脚本文件


#!/bin/bash
shopt -s expand_aliases
source ~/.bash_profile
ll



执行一下,果然成功了,这是为什么呢?



$ bash test.sh 
total 48
-rw-rw-r-- 1 liyang liyang   62 Sep 16 09:38 test.c
-rw-rw-r-- 1 liyang liyang   68 Sep 16 09:38 foo.h
-rw-rw-r-- 1 liyang liyang   74 Sep 16 09:38 foo.c
-rwxrwxr-x 1 liyang liyang 8592 Sep 16 09:44 libfoo.so
-rw-rw-r-- 1 liyang liyang 4347 Sep 16 09:44 o23.s
-rwxrwxr-x 1 liyang liyang 9451 Sep 16 09:45 test
-rw-rw-r-- 1 liyang liyang   64 Mar  8 21:33 test.sh


关键在于shopt -s expand_aliases这句话,shopt是一个命令,使用它可以控制一些shell相关的开关:expand_aliases就是其中一个,当它被开启之后,Bash脚本中的所有命令别名alias都会被展开。



expand_aliases

If set, aliases are expanded as described below under Aliases, Aliases. This option is enabled by default for interactive shells.


总结


  • alias命令可帮助我们自定义命令别名,简化运维操作


  • 缺省情况下无法将终端环境中的alias引入到Bash脚本中


  • 通过shopt -s expand_aliases,可以解决上述问题。
相关文章
|
4月前
|
监控 安全 Shell
防止员工泄密的措施:在Linux环境下使用Bash脚本实现日志监控
在Linux环境下,为防止员工泄密,本文提出使用Bash脚本进行日志监控。脚本会定期检查系统日志文件,搜索敏感关键词(如&quot;password&quot;、&quot;confidential&quot;、&quot;secret&quot;),并将匹配项记录到临时日志文件。当检测到可疑活动时,脚本通过curl自动将数据POST到公司内部网站进行分析处理,增强信息安全防护。
162 0
|
4月前
|
存储 Shell Linux
Linux Bash 脚本中的 IFS 是什么?
【4月更文挑战第25天】
89 0
Linux Bash 脚本中的 IFS 是什么?
|
21天前
|
Shell
一个能够生成 Markdown 表格的 Bash 脚本
【8月更文挑战第20天】这是一个使用Bash脚本生成Markdown表格的示例。脚本首先设置表头与内容数据,然后输出Markdown格式的表格。用户可以根据需要自定义表格内容。使用时,只需将脚本保存为文件(如 `generate_table.sh`),赋予执行权限,并运行它,即可在终端看到生成的Markdown表格。
|
20天前
|
Unix Shell Linux
在Linux中,什么是Bash脚本,并且如何使用它。
在Linux中,什么是Bash脚本,并且如何使用它。
|
22天前
|
Shell 开发者
深入理解Bash脚本中的函数
【8月更文挑战第20天】
12 0
|
22天前
|
存储 Shell 数据处理
深入探讨Bash脚本中的数组
【8月更文挑战第20天】
11 0
|
24天前
|
存储 Shell
Bash 脚本中的 `hash` 命令
【8月更文挑战第19天】
9 0
|
3月前
|
Unix Shell Linux
技术经验分享:Bash脚本命令使用详解
技术经验分享:Bash脚本命令使用详解
27 0
|
4月前
|
存储 弹性计算 运维
用bash脚本创建目录
【4月更文挑战第29天】
34 3
|
4月前
|
存储 Unix Shell
【简化Cmake编译过程 】编写通用的bash脚本:简化和构建cmake高效自动化任务
【简化Cmake编译过程 】编写通用的bash脚本:简化和构建cmake高效自动化任务
173 0