bash啟動指令碼

2021-05-24 00:46:32 字數 2817 閱讀 7590

啟動指令碼是bash啟動時自動執行的指令碼。使用者可以把一些環境變數的設定和aliasumask設定放在啟動指令碼中,這樣每次啟動shell時這些設定都自動生效。思考一下,bash在執行啟動指令碼時是以fork子shell方式執行的還是以source方式執行的?

啟動bash的方法不同,執行啟動指令碼的步驟也不相同,具體可分為以下幾種情況。

互動shell是指使用者在提示符下輸命令的shell而非執行指令碼的shell,登入shell就是在輸入使用者名稱和密碼登入後得到的shell,比如從字元終端登入或者用telnet/ssh從遠端登入,但是從圖形介面的視窗管理器登入之後會顯示桌面而不會產生登入shell(也不會執行啟動指令碼),在圖形介面下開啟終端視窗得到的shell也不是登入shell。

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

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

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

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

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

if [ -f ~/.bashrc ]; then

. ~/.bashrc

fi

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

下面做乙個實驗,在~/.bashrc檔案末尾新增一行(如果這個檔案不存在就建立它):

export path=$path:/home/akaedu
然後關掉終端視窗重新開啟,或者從字元終端logout之後重新登入,現在主目錄下的程式應該可以直接輸程式名執行而不必輸入路徑了,例如:

~$ a.out
就可以了,而不必

~$ ./a.out
為什麼登入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開頭,都屬於這種方式。

bash啟動指令碼

啟動指令碼是bash啟動時自動執行的指令碼。使用者可以把一些環境變數的設定和alias umask設定放在啟動指令碼中,這樣每次啟動shell時這些設定都自動生效。思考一下,bash在執行啟動指令碼時是以fork子shell方式執行的還是以source方式執行的?啟動bash的方法不同,執行啟動指令...

關於 bash 啟動指令碼

shell 程式 bin bash 以下以 shell 稱呼 使用了乙個啟動檔案集合,來幫助創造乙個執行的環境。每乙個檔案都有特殊的功用並對登入和互動環境有不同的影響,有的檔案還能使登入與互動環境有所不同。放在 etc 目錄下的一些檔案提供了全域性設定。如果相類似的設定檔案出現在某個使用者起始資料夾...

(轉 原創)BASH啟動指令碼及其啟動順序

登入linux後,bash要讀取幾個檔案,這些檔案 啟動指令碼檔案 用來定義bash環境,如果希望建立標準的別名,或者希望設定各種shell變數,就應該在bash啟動檔案中進行設定。這幾個檔案是 etc profile bash profile bash login profile bashrc b...