美文网首页IT🐶
Bash非交互模式下alias不能使用

Bash非交互模式下alias不能使用

作者: 爱折腾的大懒猪 | 来源:发表于2019-02-05 22:44 被阅读13次

    在Bash的非交互模式下(一般的脚本), alias是无效的.

    例如, 我在.bashrc设置了:

    alias code="/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code"
    export EDITOR=code
    

    但是在脚本执行$EDITOR (默认编辑器) 时, 报错code 命令找不到. 即使在脚本里面source ~/.bashrc亦无效. 这是因为, code是使用了alias来实现的.

    在非交互式模式下alias扩展功能默认是关闭的,此时仍然可以定义alias别名,但是shell不会将alias别名扩展成对应的命令,而是将alias别名本身当作命令执行,如果shell内置命令和PATH中均没有与alias别名同名的命令,则shell会“抱怨”找不到指定的命令。

    如果想使得非交互模式下支持alias扩展, 就要使用shopt expand_aliases. 注意shopt这个命令是shell内置命令,可以控制shell功能选项的开启和关闭,从而控制shell的行为。shopt的使用方式如下:

    shopt -s opt_name            # Enable (set) opt_name.
    shopt -u opt_name            # Disable (unset) opt_name.
    shopt opt_name                # Show current status of opt_name.
    

    测试一下alias在非交互模式的表现和使用shopt的异同:

    #!/bin/bash
     
    alias echo_hello="echo Hello!"
    shopt expand_aliases  
    echo_hello
     
    #> expand_aliases  off
    #> ./test.sh: line 5: echo_hello: command not found
    
    shopt -s  expand_aliases 
    shopt expand_aliases  
    echo_hello
    #> expand_aliases  on
    #> Hello!
    

    另外,alias别名只在当前shell有效,不能被子shell继承,也不能像环境变量一样export。可以把alias别名定义写在.bashrc文件中,这样如果启动交互式的子shell,则子shell会读取.bashrc,从而得到alias别名定义。但是执行shell脚本时,启动的子shell处于非交互式模式,是不会读取.bashrc的。

    不过,如果你一定要让执行shell脚本的子shell读取.bashrc的话,可以给shell脚本第一行的解释器加上参数:

    #!/bin/bash --login
    

    --login使得执行脚本的子shell成为一个login shell,login shell会读取系统和用户的profile及rc文件,因此用户自定义的.bashrc文件中的内容将在执行脚本的子shell中生效。

    还有一个简单的办法让执行脚本的shell读取.bashrc,在脚本中主动source ~/.bashrc即可。

    相关文章

      网友评论

        本文标题:Bash非交互模式下alias不能使用

        本文链接:https://www.haomeiwen.com/subject/pehpsqtx.html