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

参考

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

到此这篇关于在Bash脚本中引入alias的方法的文章就介绍到这了,更多相关Bash脚本引入alias内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Shell脚本bash: ./t.sh:/bin/bash^M:损坏的解释器: 没有那个文件或目录

    有时候编写脚本时会出现类似标题列出的错误,这个问题大多数是因为你的脚本文件在windows下编辑过.windows下,每一行的结尾是\n\r,而在linux下文件的结尾是\n,那么你在windows下编辑过的文件在linux下打开看的时候每一行的结尾就会多出来一个字符\r,用cat -A urfile时你可以看到这个\r字符被显示为^M,这时候只需要删除这个字符就可以了.可以使用命令sed -i 's/\r$//' urfile .有时候编写脚本时会出现类似标题列出的错误,这个问题大多数是因为你

  • 使用Python脚本在Linux下实现部分Bash Shell的教程

    对于Linux用户来说,命令行的名声相当的高.不像其他操作系统,命令行是一个可怕的命题,但是对于Linux社区中那些经验丰富的大牛,命令行却是最值得推荐鼓励使用的.通常,命令行对比图形用户界面,更能提供更优雅和更高效的解决方案. 命令行伴随着Linux社区的成长,UNIX shells,例如 bash和zsh,已经成长为一个强大的工具,也是UNIX shell的重要组成部分.使用bash和其他类似的shells,可以得到一些很有用的功能,例如,管道,文件名通配符和从文件中读取命令,也就是脚本.

  • linux bash脚本监控启动停止weblogic服务的脚本写法

    有时,linux系统需要做HA或者类似的功能,需要配置weblogic脚本来启动,停止,查看状态,可以如下方式写 命令形式:Weblogic server start|stop|restart|status ### BEGIN WLS Configration DOMAIN_NAME=base_domain SERVER_NAME=AServer ADMIN_URL="t3://ip:7001" DOMAIN_PATH=/Oracle/Middleware/user_projects/

  • 详解shell中source、sh、bash、./执行脚本的区别

    1.source命令用法: source FileName 作用:在当前bash环境下读取并执行FileName中的命令.该filename文件可以无"执行权限" 注:该命令通常用命令"."来替代. 如:source .bash_profile . .bash_profile两者等效. source(或点)命令通常用于重新执行刚修改的初始化文档. source命令(从 C Shell 而来)是bash shell的内置命令. 点命令,就是个点符号,(从Bourne

  • Bash脚本内置的调试方法技巧

    用 Bash 写的脚本也可以进行调试,和 Python,Perl 等解释型语言一样.新建一个名为 servinfo 的脚本并增加可执行权限: 复制代码 代码如下: $ vi servinfo #!/bin/bash echo "Hostname: $(hostname)" echo "Date: $(date)" echo "Kernel: $(uname -mrs)" $ chmod +x servinfo 用 bash -x 来调试上述脚本,

  • 在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>进行查看

  • 在Bash脚本中创建和使用数组方法总结

    在Bash中定义一个数组 有两种方法可以在bash脚本中创建新数组.第一个是使用declare命令来定义一个Array.此命令将定义名为test_array的关联数组. $ declare -a test_array 还可以通过分配元素来创建数组. $ test_array=(apple orange lemon) 访问数组元素 与其他编程语言类似,bash数组元素可以使用索引号从0开始,然后从1.2.3-n开始访问.这也适用于索引号为数字的关联数组. $ echo ${test_array[0

  • Linux 在Bash脚本中怎么关闭文件描述符的实例

    Linux 在Bash脚本中怎么关闭文件描述符的实例 在写一个Bash脚本的时候碰到一个问题,这个脚本是用来启动一个程序B的,而这个脚本又被另一个程序A调用,结果发现新启动的B进程中有很多A进 程打开的文件描述符(如Socket).因此决定在脚本中将它们关闭,因为为了简单起见,我在A程序中使用了system()来启动该脚本. 增加了关闭文 件描述符的脚本如下: #!/bin/sh cd $(dirname "$0") || exit 1 exec 3>&- exec 4&

  • Pycharm取消py脚本中SQL识别的方法

    Pycharm默认可以识别py脚本中的SQL语句,本身很不错,但当SQL拼接时就显示的代码特别难看,找了好久,终于知道怎么关闭SQL识别功能了. 如下图,把勾去掉就可以了. 以上这篇Pycharm取消py脚本中SQL识别的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • linux Bash脚本判别使用者的身份方法示例

    经常要在bash脚本里面或者直接对脚本本身加上sudo运行命令,但是这引发了一系列的问题. 比如用sudo的时候,脚本里的~或$HOME指代用户文件夹的这个变量,到底是应该指向我真正的用户文件夹如/home/pi呢,还是指向了超级管理员的用户文件夹/root/呢? 实际上它指向了/root/文件夹,这是我们绝对不想要的.但是很多命令如安装个程序,都不得不用sudo,那怎么办? 首先要说下经验:命令行的权限执行,从表现上来看,可以分为以下5种情况: admin-manual: 普通用户手敲命令 s

  • angular4中引入echarts的方法示例

    1.安装ngx-echarts npm install echarts --save npm install ngx-echarts --save 2.在项目中引入echarts //angular-cli.json文件 { "apps": [{ "scripts":[ "../node_modules/echarts/dist/echarts.min.js", "../node_modules/echarts/map/js/china

  • bash脚本中if语句的使用方法

    除了 "if,else" 形式之外,还有其它形式的 "if" 语句: 复制代码 代码如下: if [ condition ]then actionfi 只有当 condition 为真时,该语句才执行操作,否则不执行操作,并继续执行 "fi" 之后的任何行. 复制代码 代码如下: if [ condition ]then actionelif [ condition2 ]then action2...elif [ condition3 ]then

  • vue系列之requireJs中引入vue-router的方法

    requireJs简介 参数配置 requireJS 常用的方法与命令也就两个,因此requireJS使用起来非常简单. require define 其中define是用于定义模块,而require是用于载入模块以及载入配置文件. define([id,deps,] callback); require(deps[,callback]); 加载配置文件 独立的引入配置文件也有两种方式,一种是通过script标签加载外部JS文件形式: <script src="js/require.js&

  • shell脚本中取消重定向的方法实例

    在上一篇关于shell编程的例子中,有讲到把shell脚本进行扩展之后重定向到一个文件中,以便进行查看和调试http://www.jb51.net/article/62435.htm.但是,若是有另一种情况:只是在某些地方进行重定向,而其他地方不进行重定向.那么我们就来修改一下上一篇中的例子来进行这种需求的满足: 复制代码 代码如下: #!/bin/bash function setlogfile {     if ! [ -z "$1" ]; then         echo &q

随机推荐