更多精彩内容,请关注微信公众号:后端技术小屋

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,可以解决上述问题。

参考

https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

推荐阅读

更多精彩内容,请扫码关注微信公众号:后端技术小屋。如果觉得文章对你有帮助的话,请多多分享、转发、在看。

如何在Bash脚本中引入alias的更多相关文章

  1. grep 查找bash脚本中的注释代码

    出于安全性的考虑,不建议在bash脚本中注释掉不使用的代码.也就是说如果某段代码不使用了,那么应该删除掉,而不是简单地注释掉.假如你突然意识到这一点,而以前并没有遵从这个原则,现在需要找出脚本中的注释 ...

  2. 转:如何在 LoadRunner 脚本中做关联 (Correlation)

    如何在 LoadRunner 脚本中做关联 (Correlation) 当录制脚本时,VuGen会拦截client端(浏览器)与server端(网站服务器)之间的对话,并且通通记录下来,产生脚本.在V ...

  3. 如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样)

    如何在Python脚本中调用外部命令(就像在linux shell或Windows命令提示符下输入一样) python标准库中的subprocess可以解决这个问题. from subprocess ...

  4. 技术分享:如何在PowerShell脚本中嵌入EXE文件

    技术分享:如何在PowerShell脚本中嵌入EXE文件 我在尝试解决一个问题,即在客户端攻击中只使用纯 PowerShell 脚本作为攻击负荷.使用 PowerShell 运行恶意代码具有很多优点, ...

  5. 2.Jmeter 如何在jsr223 脚本中停止测试任务

    Jmeter 如何在jsr223 脚本中停止测试任务 在可以直接引用ctx的变量的processor中可以执行如下脚本即可. (例如jsr223 postprocessor中) ctx.getEngi ...

  6. Linux shell 脚本中使用 alias 定义的别名

    https://www.cnblogs.com/chenjo/p/11145021.html 核心知识点: 用 shopt 开启和关闭 alias 扩展 交互模式下alias 扩展默认是开启的,脚本模 ...

  7. 在shell脚本中使用alias

    Linux shell有交互式与非交互式两种工作模式.我们日常使用shell输入命令得到结果的方式是交互式的方式,而shell脚本使用的是非交互式方式.   shell提供了alias功能来简化我们的 ...

  8. 如何在batch脚本中嵌入python代码

    老板叫我帮他测一个命令在windows下消耗的时间,因为没有装windows那个啥工具包,没有timeit那个命令,于是想自己写一个,原理很简单: REM timeit.bat echo %TIME% ...

  9. bash 脚本中分号的作用

    在Linux bash shell中,语句中的分号一般用作代码块标识 1.单行语句一般要用到分号来区分代码块.比如: weblogic@pmtest:/$if [ "$PS1" ] ...

随机推荐

  1. Light Bulb ZOJ - 3203 三分

    三分: 和二分非常类似的一个算法,与二分不同的是 二分是单调的,而三分是一个先增后减或者先减后增 三分可以求出峰值. 注意三分一定是严格单调的,不能有相等的情况. 讲个例题: 题目 题意: 一个人发现 ...

  2. Codeforces Round #531 (Div. 3) C. Doors Breaking and Repairing (博弈)

    题意:有\(n\)扇门,你每次可以攻击某个门,使其hp减少\(x\)(\(\le 0\)后就不可修复了),之后警察会修复某个门,使其hp增加\(y\),问你最多可以破坏多少扇门? 题解:首先如果\(x ...

  3. Linux系统编程【2】——编写who命令

    学到的知识点 通过实现who命令,学到了: 1.使用man命令寻找相关信息 2.基于文件编程 3.体会到c库函数与系统调用的不同 4.加深对缓冲技术的理解 who命令的作用 who命令的使用 在控制终 ...

  4. SpringBoot整合shiro-MD5盐值加密

    为什么要进行密码加密? 在我们的日常生活中,许多人有着在不同网站上使用相同密码的坏习惯(包括我也是qaq),假如应用程序或服务器出现漏洞,数据被窃取,用户的明文密码直接被暴露给黑客.显然后果将不堪设想 ...

  5. 数学知识-欧拉函数&快速幂

    欧拉函数 定义 对于正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目,记作φ(n). 算法思路 既然求解每个数的欧拉函数,都需要知道他的质因子,而不需要个数 因此,我们只需求出他的质因子, ...

  6. 手把手教你通过SQL注入盗取数据库信息

    目录 数据库结构 注入示例 判断共有多少字段 判断字段显示位置 显示出登录用户和数据库名 查看所有数据库 获取对应数据库的表 获取对应表的字段名称 获取用户密码 SQL注入(SQL Injection ...

  7. 自动生成requirements.txt

    Python 自动生成当前项目的requirements.txt 通常我们开发一个python项目时都会用conda 或者 virtualenv 等虚拟环境管理工具来创建一个虚拟环境,在这个虚拟环境中 ...

  8. CodeForces - 803C Maximal GCD 【构造】

    You are given positive integer number n. You should create such strictly increasing sequence of k po ...

  9. CNN可视化技术总结(三)--类可视化

    CNN可视化技术总结(一)-特征图可视化 CNN可视化技术总结(二)--卷积核可视化 导言: 前面我们介绍了两种可视化方法,特征图可视化和卷积核可视化,这两种方法在论文中都比较常见,这两种更多的是用于 ...

  10. HTML教程(看完这篇就够了)

    HTML教程 超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言.您可以使用 HTML 来建立自己的 WEB 站点,HTML 运 ...