Linux shell有交互式与非交互式两种工做模式。咱们平常使用shell输入命令获得结果的方式是交互式的方式,而shell脚本使用的是非交互式方式。shell
shell提供了alias功能来简化咱们的平常操做,使得咱们能够为一个复杂的命令取一个简单的名字,从而提升咱们的工做效率。在交互式模式下,shell的alias扩展功能是打开的,所以咱们能够键入本身定义的alias别名来执行对应的命令。bash
可是,在非交互式模式下alias扩展功能默认是关闭的,此时仍然能够定义alias别名,可是shell不会将alias别名扩展成对应的命令,而是将alias别名自己看成命令执行,若是shell内置命令和PATH中均没有与alias别名同名的命令,则shell会“抱怨”找不到指定的命令。
那么,有没有办法在非交互式模式下启用alias扩展呢?答案是使用shell内置命令shopt命令来开启alias扩展选项。shopt是shell的内置命令,能够控制shell功能选项的开启和关闭,从而控制shell的行为。shopt的使用方式以下:ide
1 |
shopt -s opt_name Enable ( set ) opt_name. |
2 |
shopt -u opt_name Disable ( unset ) opt_name. |
3 |
shopt opt_name Show current status of opt_name. |
alias扩展功能的选项名称是expand_aliases,咱们能够在交互式模式下查看此选项是否开启:spa
1 |
sw@gentoo ~ $ shopt expand_aliases |
可见在交互式模式下alias扩展功能的确是开启的,所以咱们才能使用alias别名。code
咱们编写一个脚原本验证一下非交互式模式下alias扩展的设置:orm
3 |
alias echo_hello= "echo Hello!" |
7 |
shopt -s expand_aliases |
脚本执行结果以下:继承
1 |
sw@gentoo ~ $ . /test .sh |
3 |
. /test .sh: line 5: echo_hello: command not found |
能够看到,在非交互式模式下alias扩展功能默认是关闭的,可是咱们能够用shopt来将其开启。string
另外,alias别名只在当前shell有效,不能被子shell继承,也不能像环境变量同样export。能够把alias别名定义写在.bashrc文件中,这样若是启动交互式的子shell,则子shell会读取.bashrc,从而获得alias别名定义。可是执行shell脚本时,启动的子shell处于非交互式模式,是不会读取.bashrc的。it
不过,若是你必定要让执行shell脚本的子shell读取.bashrc的话,能够给shell脚本第一行的解释器加上参数:io
--login使得执行脚本的子shell成为一个login shell,login shell会读取系统和用户的profile及rc文件,所以用户自定义的.bashrc文件中的内容将在执行脚本的子shell中生效。
还有一个简单的办法让执行脚本的shell读取.bashrc,在脚本中主动source ~/.bashrc便可。