啟動指令碼是bash
啟動時自動執行的指令碼。使用者可以把一些環境變數的設定和alias
、umask
設定放在啟動指令碼中,這樣每次啟動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
命令啟動bash
,bash
將模擬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...