1、從兩個不同維度來划分,是否交互式,是否登錄
2、交互式shell和非交互式shell
- 交互式模式:在終端上執行,shell等待你的輸入,並且立即執行你提交的命令。這種模式被稱作交互式是因為shell與用戶進行交互。這種模式也是大多數用戶非常熟悉的:登錄、執行一些命令、退出。當你退出后,shell也終止了。
- 非交互式模式:以shell script(非交互)方式執行。在這種模式 下,shell不與你進行交互,而是讀取存放在文件中的命令,並且執行它們。當它讀到文件的結尾EOF,shell也就終止了。
- 可以通過打印“$-”變量的值(代表着當前shell的選項標志),查看其中的“i”選項(表示interactive shell)來區分交互式與非交互式shell。
[
root@client02 ~]# echo $-
himBH
[
root@client02 ~]#
[
root@client02 ~]# cat test.sh
echo $-
[
root@client02 ~]# sh test.sh
hB
[
root@client02 ~]#
3、登錄shell和非登陸shell
- 登錄shell:需要用戶名、密碼登錄后才能進入的shell(或者通過--login”選項生成的shell)。
- 非登錄shell:不需要輸入用戶名和密碼即可打開的Shell,例如:直接命令“bash”就是打開一個新的非登錄shell;在Gnome或KDE中打開一個“終端”(terminal)窗口程序也是一個非登錄shell。
- 退出一個登錄shell:exit或者logout;退出一個非登錄shell:只能exit。
[
root@client02 ~]#
su - zhuwan
Last login: Mon Sep 3 18:26:24 CST 2018 on pts/0
[
zhuwan@client02 ~]$ exit
logout
[
root@client02 ~]#
su - zhuwan
Last login: Mon Sep 3 19:14:45 CST 2018 on pts/0
[
zhuwan@client02 ~]$ logout
[
root@client02 ~]#
su zhuwan
[
zhuwan@client02 root]$ exit
exit
[
root@client02 ~]#
su zhuwan
[
zhuwan@client02 root]$ logout
bash: logout: not login shell: use `exit'
- 登錄shell 時,其bash進程名為”-bash“;非登陸shell時,bash進程名為”bash”
[
root@client02 ~]# su - zhuwan
Last login: Mon Sep 3 19:15:09 CST 2018 on pts/0
[
zhuwan@client02 ~]$ echo $0
-bash
[
zhuwan@client02 ~]$ logout
[
root@client02 ~]# su zhuwan
[
zhuwan@client02 root]$ echo $0
bash
4、登錄shell和非登陸shell讀取配置文件的區別
- 登錄shell:/etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) ->( ~/.bashrc -> /etc/bashrc) -> ~/.bash_logout
- .profile(由Bourne Shell和Korn Shell使用)和.bash_login(由C Shell使用)兩個文件是.bash_profile的同義詞,目的是為了兼容其它Shell
- .bash_profile中一般會執行.bashrc
- 交互式非登陸shell: ~/.bashrc -> /etc/bashrc
6、crontab中shell的特點
crontab腳本,既不是交互式shell,也不是登錄shell,不會執行上述的配置文件,有如下兩種處理方法:
- 可以把shebang改為#!/bin/bash -l讓腳本用登錄Shell來解釋執行,這個時候,執行腳本要采用路徑執行的方式
- 調用Bash解釋器,加-l參數,即 /bin/bash -l script