登錄、非登錄shell,交互、非交互shell,以及它們的startup文件

家目錄下的配置文件.bashrc中rc的含義是resource configurationshell

什麼是登錄shell?什麼是非登錄shell?bash

登錄shell是指:(1)用戶登錄時,輸入用戶名和密碼後啓動的shell;(2)經過帶--login參數的命令:bash --login而啓動的shell。對於用戶來講,登錄shell和非登錄shell的主要區別是:啓動shell時所執行的startup文件不一樣。我在/etc/profile、~/.bash_profile、~/.bashrc三個文件中分別經過echo命令打印出文件名。執行命令以下所示:ide

wangjk@wangjiankun:~$ bash
.bashrc
wangjk@wangjiankun:~$ bash --login
etc/profile
.bash_profile
.bashrc
wangjk@wangjiankun:~$this

上面的結果說明:登錄shell執行startup文件爲:/etc/profile、~/.bash_profile、~/.bashrc(這裏只是從現象上得出的推論,這種推論是有問題的,稍後討論),而非登錄shell執行的startup文件僅爲:~/.bashrc。get

bash做爲登錄shell是由/etc/login程序解析/etc/passwd文件而指定的,例如:wangjk:x:1000:1000:wangjiankun,,,:/home/wangjk:/bin/bash,其中紅色域指定了用戶的登陸shell是bash。it

事實上,bash做爲登錄shell啓動時執行的startup文件以下:io

  • /etc/profile
  • ~/.bash_profile,~/.bash_login or ~/.profile, first existing readable file is read

而bash做爲非登錄shell啓動時讀取~/.bashrc。注意,做爲登錄shell時bash並不讀取~/.bashrc,可是在文件~/.bash_profile中一般都有以下語句來讀取~/.bashrc:class

if [ –f  ~/.bashrc ]; then . ~/.bashrc; fitest

以上討論的是交互式bash shell,其實shell有兩種工做模式,就是:交互式和非交互式,執行腳本時,shell就工做在非交互式模式下。在非交互模式下,bash讀取的startup文件由環境變量BASH_ENV來決定,例如,我在~/.test文件中用echo命令打印語句:I test non-interactive shell,在test.sh腳本中打印語句:this file is test.sh,運行輸出結果以下:登錄

wangjk@wangjiankun:~$
wangjk@wangjiankun:~$ echo $BASH_ENV

wangjk@wangjiankun:~$ ./test.sh                                            
this file is test.sh
wangjk@wangjiankun:~$ export BASH_ENV=~/.test
wangjk@wangjiankun:~$ ./test.sh                                            
I test non-interactive shell
this file is test.sh
wangjk@wangjiankun:~$

注意,中間的那個空行表示環境變量BASH_ENV爲空,因此第一次運行腳本test.sh時只輸出了一句話,在定義了環境變量BASH_ENV爲~/.test之後運行腳本test.sh就打印了兩句話其中第一句是運行文件~/.test打印出來的。

相關文章
相關標籤/搜索