Shell shell啟動的四種方式及區別

2021-06-21 09:25:54 字數 2754 閱讀 5609

shell指令碼啟動有多種方式,各種方式會載入不同的指令碼,直接決定當前shell中的環境變數,具體shell啟動方式如下:

1.  互動登入shell啟動,或者使用--login引數啟動

登入shell就是在輸入使用者名稱和密碼登入後得到的shell,比如從字元終端登入或者用telnet/ssh從遠端登入。

這樣啟動bash會自動執行以下指令碼:

1).首先執行/etc/profile,系統中每個使用者登入時都要執行這個指令碼,如果系統管理員希望某個設定對所有使用者都生效,可以寫在這個指令碼裡 

2) . 然後依次查詢當前使用者主目錄的~/.bash_profile~/.bash_login~/.profile三個檔案,找到第乙個存在並且可讀的檔案來執行,如果希望某個設定只對當前使用者生效,可以寫在這個指令碼裡,由於這個指令碼在/etc/profile之後執行,/etc/profile設定的一些環境變數的值在這個指令碼中可以修改,也就是說,當前使用者的設定可以覆蓋(override)系統中全域性的設定。~/.profile這個啟動指令碼是sh規定的,bash規定首先查詢以~/.bash_開頭的啟動指令碼,如果沒有則執行~/.profile,是為了和sh保持一致。

3) .順便一提,在退出登入時會執行~/.bash_logout指令碼(如果它存在的話)。

2. 互動非登入shell啟動

在圖形介面下開乙個終端視窗,或者在登入shell提示符下再輸入bash命令,就得到乙個互動非登入的shell。

這種shell在啟動時自動執行~/.bashrc指令碼,並以fork子shell的方式執行,即繼承父shell的環境變數,並依據.bashrc來修改,執行完後本地變數不會儲存到父shell中去。

有時為了使登入shell也能自動執行~/.bashrc,通常在~/.bash_profile中呼叫~/.bashrc

if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

上面的意思是,如果~/.bashrc檔案存在則source它。多數linux發行版在建立帳戶時會自動建立~/.bash_profile~/.bashrc指令碼,~/.bash_profile中通常都有上面這幾行。所以,如果要在啟動指令碼中做某些設定,使它在圖形終端視窗和字元終端的shell中都起作用,最好就是在~/.bashrc中設定。

為什麼登入shell和非登入shell的啟動指令碼要區分開呢?最初的設計是這樣考慮的,如果從字元終端或者遠端登入,那麼登入shell是該使用者的所有其它程序的父程序,也是其它子shell的父程序,所以環境變數在登入shell的啟動指令碼裡設定一次就可以自動帶到其它非登入shell裡,而shell的本地變數、函式、alias等設定沒有辦法帶到子shell裡,需要每次啟動非登入shell時設定一遍,所以就需要有非登入shell的啟動指令碼,所以一般來說在~/.bash_profile裡設定環境變數,在~/.bashrc裡設定本地變數、函式、alias等。如果你的linux帶有圖形系統則不能這樣設定,由於從圖形介面的視窗管理器登入並不會產生登入shell,所以環境變數也應該在~/.bashrc裡設定。 

為執行指令碼而fork出來的子shell是非互動shell,啟動時執行的指令碼檔案由環境變數bash_env定義,相當於自動執行以下命令:

if [ -n "$bash_env" ]; then
. "$bash_env";
fi
如果環境變數bash_env的值不是空字串,則把它的值當作啟動指令碼的檔名,source這個指令碼。

如果以sh命令啟動bashbash將模擬sh的行為,以~/.bash_開頭的那些啟動指令碼就不認了。所以,如果作為互動登入shell啟動,或者使用--login引數啟動,則依次執行以下指令碼:

/etc/profile

~/.profile

如果作為互動shell啟動,相當於自動執行以下命令:

if [ -n "$env" ]; then . "$env"; fi
如果作為非互動shell啟動,則不執行任何啟動指令碼。通常我們寫的shell指令碼都以#! /bin/sh開頭,都屬於這種方式。

Android activity的四種啟動模式

1 standard 預設模式,無論何時,啟動乙個activity時,都會在task棧頂建立乙個該activity的新例項 2 singletop 啟動乙個activity時,如果task棧頂是該activity的例項,則重用該例項,並呼叫onnewintent 方法 如果task棧頂不是該acti...

Android Activity的四種啟動模式

對安卓而言,activity有四種啟動模式,它們是 standard 標準模式,每次都新建乙個例項物件 singletop 如果在任務棧頂發現了相同的例項則重用,否則新建並壓入棧頂 singletask 如果在任務棧中發現了相同的例項,將其上面的任務終止並移除,重用該例項。否則新建例項併入棧 sin...

Activity四種啟動模式

launchmode在多個activity跳轉的過程中扮演著重要的角色,它可以決定是否生成新的activity例項,是否重用已存在的activity例項,是否和其他activity例項公用乙個task裡。這裡簡單介紹一下task的概念,task是乙個具有棧結構的物件,乙個task可以管理多個acti...