1.1 判断是否交互式、是否登录式
1.2 几种常见的bash启动方式
1.3 加载bash环境配置文件
当用户登录系统时,会加载各种bash配置文件,还会设置或清空一系列变量,有时还会执行一些自定义的命令。这些行为都算是启动bash时的过程。
另外,有些时候登录系统是可以交互的(如正常登录系统),有些时候是无交互的(如执行一个脚本),因此总的来说bash启动类型可分为交互式shell和非交互式shell。更细分一层,交互式shell还分为交互式的登录shell和交互式非登录shell,非交互的shell在某些时候可以在bash命令后带上"--login"或短选项"-l",这时也算是登录式,即非交互的登录式shell。
1.1 判断是否交互式、是否登录式判断是否为交互式shell有两种简单的方法:
方法一:判断变量"-",如果值中含有字母"i",表示交互式。
[root@linuxidc~]# echo $- himBH [root@linuxidc~]# vim a.sh #!/bin/bash echo $- [root@linuxidc~]# bash a.sh hB
方法二:判断变量PS1,如果值非空,则为交互式,否则为非交互式,因为非交互式会清空该变量。
[root@linuxidc~]# echo $PS1 [\u@\h \W]\$
判断是否为登录式的方法也很简单,只需执行"shopt login"即可。值为"on"表示为登录式,否则为非登录式。
[root@linuxidc~]# shopt login_shell login_shell on
[root@linuxidc~]# bash [root@linuxidc~]# shopt login_shell login_shell off
所以,要判断是交互式以及登录式的情况,可简单使用如下命令:
echo $PS1;shopt login_shell
或者
echo $-;shopt login_shell
(1).正常登录(伪终端登录如ssh登录,或虚拟终端登录)时,为交互式登录shell。
[root@linuxidc~]# echo $PS1;shopt login_shell [\u@\h \W]\$ login_shell on
(2).su命令,不带"--login"时为交互式、非登录式shell,带有"--login"时,为交互式、登录式shell。
[root@linuxidc~]# su root [root@linuxidc~]# echo $PS1;shopt login_shell [\u@\h \W]\$ login_shell off
[root@linuxidc~]# su - Last login: Sat Aug 19 13:24:11 CST 2017 on pts/0 [root@linuxidc~]# echo $PS1;shopt login_shell [\u@\h \W]\$ login_shell on
(3).执行不带"--login"选项的bash命令时为交互式、非登录式shell。但指定"--login"时,为交互式、登录式shell。
[root@linuxidc~]# bash [root@linuxidc~]# echo $PS1;shopt login_shell [\u@\h \W]\$ login_shell off
[root@linuxidc~]# bash -l [root@linuxidc~]# echo $PS1;shopt login_shell [\u@\h \W]\$ login_shell on
(4).使用命令组合(使用括号包围命令列表)以及命令替换进入子shell时,继承父shell的交互和登录属性。
[root@linuxidc~]# (echo $BASH_SUBSHELL;echo $PS1;shopt login_shell) 1 [\u@\h \W]\$ login_shell on
[root@linuxidc~]# su [root@linuxidc~]# (echo $BASH_SUBSHELL;echo $PS1;shopt login_shell) 1 [\u@\h \W]\$ login_shell off
(5).ssh执行远程命令,但不登录时,为非交互、非登录式。
[root@linuxidc~]# ssh localhost 'echo $PS1;shopt login_shell' login_shell off
(6).执行shell脚本时,为非交互、非登录式shell。但指定了"--login"时,将为非交互、登录式shell。
例如,脚本内容如下:
[root@linuxidc~]# vim b.sh #!/bin/bash echo $PS1 shopt login_shell
不带"--login"选项时,为非交互、非登录式shell。
[root@linuxidc~]# bash b.sh login_shell off
带"--login"选项时,为非交互、登录式shell。
[root@linuxidc~]# bash -l b.sh login_shell on
(7).在图形界面下打开终端时,为交互式、非登录式shell。
但可以设置为使用交互式、登录式shell。
1.3 加载bash环境配置文件