shell指令碼啟動有多種方式,各種方式會載入不同的指令碼,直接決定當前shell中的環境變數,具體shell啟動方式如下:
1. 互動登入shell啟動,或者使用--login引數啟動
登入shell就是在輸入使用者名稱和密碼登入後得到的shell,比如從字元終端登入或者用telnet
/ssh
從遠端登入。
這樣啟動bash
會自動執行以下指令碼:
1).首先執行/etc/profile
,系統中每個使用者登入時都要執行這個指令碼,如果系統管理員希望某個設定對所有使用者都生效,可以寫在這個指令碼裡
2) . 然後依次查詢當前使用者主目錄的2. 互動非登入shell啟動~/.bash_profile
、~/.bash_login
和~/.profile
三個檔案,找到第乙個存在並且可讀的檔案來執行,如果希望某個設定只對當前使用者生效,可以寫在這個指令碼裡,由於這個指令碼在/etc/profile
之後執行,/etc/profile
設定的一些環境變數的值在這個指令碼中可以修改,也就是說,當前使用者的設定可以覆蓋(override)系統中全域性的設定。~/.profile
這個啟動指令碼是sh
規定的,bash
規定首先查詢以~/.bash_
開頭的啟動指令碼,如果沒有則執行~/.profile
,是為了和sh
保持一致。3) .順便一提,在退出登入時會執行
~/.bash_logout
指令碼(如果它存在的話)。
在圖形介面下開乙個終端視窗,或者在登入shell提示符下再輸入bash
命令,就得到乙個互動非登入的shell。
這種shell在啟動時自動執行~/.bashrc
指令碼,並以fork子shell的方式執行,即繼承父shell的環境變數,並依據.bashrc來修改,執行完後本地變數不會儲存到父shell中去。
有時為了使登入shell也能自動執行~/.bashrc
,通常在~/.bash_profile
中呼叫~/.bashrc
:
if [ -f ~/.bashrc ]; then. ~/.bashrcfi
上面的意思是,如果~/.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
命令啟動bash
,bash
將模擬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...