当前位置 博文首页 > 在Bash脚本中引入alias的方法

    在Bash脚本中引入alias的方法

    作者:后端技术小屋 时间:2021-04-28 17:52

    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

    js
    下一篇:没有了