2009-01-06 76 views
130

我已經使用了多年不同的基於nix的系統,並且它似乎像我使用的每種Bash都有不同的算法來決定運行哪些啓動腳本。對於設置環境變量和別名以及打印啓動消息(例如MOTD)這樣的任務而言,哪個啓動腳本是適當的位置?.bashrc,.bash_profile和.environment之間有什麼區別?

把東西放在.bashrc.bash_profile.environment之間有什麼區別?我還看過其他文件,如.login,.bash_login.profile;這些都是相關的嗎?在物理登錄時,通過ssh遠程登錄並打開一個新的終端窗口,有哪些不同?跨平臺(包括Mac OS X(及其Terminal.app)和Cygwin Bash)是否存在重大差異?

回答

73

與shell配置文件的主要區別在於,有些只能通過「登錄」shell(例如,從另一臺主機登錄或在本地unix機器的文本控制檯登錄時)讀取。這些被稱爲.login.profile.zlogin(取決於您使用的是哪個外殼)。

然後你有配置文件被「交互式」shell讀取(例如,連接到終端的配置文件(或僞終端,例如在窗口系統下運行的終端仿真器)。與像.bashrc名,.tcshrc.zshrc等的那些

bash.bashrc複雜化,這是只能由外殼,既是互動非登錄讀,所以你會發現大多數人最後告訴他們.bash_profile也讀.bashrc喜歡的東西

[[ -r ~/.bashrc ]] && . ~/.bashrc

其他炮彈不同的表現 - 例如用zsh.zshrc總是讀一個交互式shell,無論是登錄一個或沒有。

bash的手冊頁解釋了讀取每個文件的情況。是的,機器之間的行爲通常是一致的。

.profile只是/bin/sh最初使用的登錄腳本文件名。 bash,通常與/bin/sh向後兼容,如果存在的話,將會讀取.profile

7

我發現有關的.bashrc和.bash_profile中here來概括:

.bash_profile中執行時你 登錄。你放在那裏的東西可能是 你的PATH和其他重要的 環境變量。

.bashrc用於非登錄shell。 我不確定這意味着什麼。我知道那 RedHat的 執行它每次啓動 另一個shell(su到該用戶或 簡單地調用慶典再次)你可能 希望把別名在那裏,但再次 我不知道這意味着什麼。 I 根本無視它自己。

.profile等效於 .bash_profile的根目錄。我認爲 的名字被改變了,讓其他的 shell(csh,sh,tcsh)也使用它。 (你不需要一個作爲用戶)

還有.bash_logout至極 執行,是啊好猜...註銷。 你可能想停止deamons,甚至 做一個小家務。如果你想 在註銷時清除屏幕,你可以在 的位置添加「清除」。

也有一個完整的跟進每個配置文件的here

這些甚至可能distro.依賴,並非所有的發行版選擇與他們每個configuraton有的甚至更多。但是當他們有相同的名字時,他們通常會包含相同的內容。

2

一個很好的地方是bash的man page。 Here的在線版本。查找「INVOCATION」部分。

9

傳統上,~/.profile被Bourne Shell使用,並可能被Bash支持作爲傳統措施。再次,C Shell使用~/.login~/.cshrc - 我不確定Bash是否使用它們。

~/.bash_profile將在登錄時使用一次。每次啓動shell時都會讀取~/.bashrc腳本。這與C Shell的/.cshrc類似。

其中一個後果是,~/.bashrc中的內容應儘可能輕量級(最小),以減少啓動非登錄shell時的開銷。

我相信~/.environment文件是Korn Shell的兼容文件。

48

這很簡單。它在man bash解釋說:

/bin/bash 
     The bash executable 
/etc/profile 
     The systemwide initialization file, executed for login shells 
~/.bash_profile 
     The personal initialization file, executed for login shells 
~/.bashrc 
     The individual per-interactive-shell startup file 
~/.bash_logout 
     The individual login shell cleanup file, executed when a login shell exits 
~/.inputrc 
     Individual readline initialization file 

登錄殼是被讀出一個你登錄(所以,他們不執行時只啓動的xterm,例如)中的那些。還有其他方式登錄。例如使用X顯示管理器。那些在登錄時有其他方式來讀取和導出環境變量。

另請參閱手冊中的INVOCATION一章。它說「以下段落描述了bash如何執行其啓動文件。」,我認爲這是一個獨特的:)它解釋了什麼是「交互式」外殼。

Bash不知道約.environment。我懷疑這是你的發行版本的一個文件,要獨立於你驅動的shell設置環境變量。

+1

你可以添加`/ etc/bashrc`來滿足答案嗎? – Nemoden 2012-09-27 14:12:17

4

根據Josh Staiger,對於每個新的終端窗口,默認情況下,Mac OS X的Terminal.app運行登錄shell而不是非登錄shell,調用.bash_profile而不是.bashrc。

他建議:

大多數時候,你不希望爲登錄和非登錄shell兩個獨立的配置文件 - 當你設置一個路徑,你想讓它 申請都。您可以通過從 .bash_profile文件中獲取.bashrc來解決此問題,然後將PATH和常用設置放在.bashrc中。從.bashrc中會被調用控制檯

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

現在,當您登錄到 機:

要做到這一點,添加以下行.bash_profile中。

0

我用這似乎執行.profile Debian的發行版系列,但不是.bash_profile, 而RHEL衍生.profile之前執行.bash_profile

當你必須設置環境變量以在任何Linux操作系統中工作時,它似乎是一團糟。

相關問題