• 在Bash脚本中引入alias的问题


    如何在Bash脚本中引入alias - 后端技术小屋 - 博客园 https://www.cnblogs.com/taiyang-li/archive/2021/03/08/14502975.html

    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

  • 相关阅读:
    双击快速打开.ipynb文件的方法
    关于selenium元素点击时出现“element click intercepted :“报错解决办法(亲测可用)
    centos 安装Selenium+Chrome
    最全苹果cms问题解决100
    -scrapy startproject时,报错 from cryptography.hazmat.bindings._openssl import ffi, lib的解决方法
    解决打开fiddle后不能上网
    python学习笔记 pip安装加速&&python淘宝镜像安装包
    lxml.etree类型。不能序列化ElementUnicodeResult
    最值问题
    数列的求和公式
  • 原文地址:https://www.cnblogs.com/rsapaper/p/15988286.html
Copyright © 2020-2023  润新知