profile,bashrc,.bash_profile,.bash_login,.profile,.bashrc,.bash_logout淺析 Part 1
by:授客 QQ:1033553122
(CentOS-6.0-x86_64-bin-DVD1.iso為例)
1、 普通使用者
[root@localhost home]# useradd test
[root@localhost home]# passwd test
...
passwd: all authentication tokens updated successfully.
[test@localhost ~]$ cd /home/test
[test@localhost ~]$ ll -a
total 28
...
-rw-r--r--. 1 test test 18
May 30 2011
.bash_logout
-rw-r--r--. 1 test test 176 May 30 2011
.bash_profile
-rw-r--r--. 1 test test 124 May 30 2011
.bashrc
可見使用者主目錄/home/username/目錄下包含了以上3個檔案(及其它本文不關注的檔案)
#檢視.bash_profile檔案
[root@localhost test]# cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
代碼淺析:
-f ~/.bashrc:如果/home/test/.bashrc為普通檔案,那麼傳回真,即if
[ true ],
if [ -f ~/.bashrc ]:then
. ~/.bashrc
#等同source
~/.bashrc
fi
#結束if語句
如果-f
~/.bashrc傳回真,那麼執行/home/test/.bashrc腳本
#使用者特定的環境和啟動程式
#檢視.bashrc檔案
[root@localhost test]# cat .bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
# User specific aliases and functions
/etc/bashrc傳回真,那麼執行/etc/.bashrc腳本
# User specific aliases and functions #使用者特定的别名和函數
#檢視.bash_logout檔案
[root@localhost test]# cat .bash_logout
# ~/.bash_logout
2、
超級使用者
[root@localhost test]# cd /root/
[root@localhost ~]# ll -a
total 172
-rw-r--r--.
1 root root
18 May 20
2009 .bash_logout
1 root root 311
Sep 3 22:42
1 root root 176
Sep 23 2004
如上,和普通使用者一樣,包含了以上3個檔案(及本文不關注的其它檔案)
[root@localhost ~]# cat .bash_profile
[root@localhost ~]# cat .bashrc
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
[root@localhost ~]# cat .bash_logout
對比root和普通使用者,我們可以得出:
1.
linux使用者主目錄(超級使用者主目錄:~為/root
普通使用者主目錄:~為/home/username)下包含以3個檔案
~/.bash_profile
~/.bash_logout
預設情況下,這些檔案的設定,僅對單一使用者起作用
2.
~/.bash_logout檔案預設啥都不做
3.
~/.bash_profile:該檔案用于為單個使用者自身設定特定的局部環境(比如path環境變量)和啟動程式,某些情況下,還用于執行~/.bashrc檔案
4.
~./bashrc:該檔案用于為單個運作bash
shell的使用者自身設定特定的資源(比如指令别名和函數,本地變量),某些情況下,還用于執行/etc/bashrc檔案(注:rc的含義是resource
configuration,該檔案是針對bash
shell的,這個角度來說它的作用域也是局部的,因為其它shell有其它shell自己的rc檔案)
5.
當使用者登入時,該檔案僅僅執行一次!預設情況下,他設定一些環境變量,執行使用者的.bashrc檔案。
3、
/etc/profile && /etc/bashrc
#etc目錄下的配置檔案
[root@localhost ~]# cd /etc/
[root@localhost etc]# ll -a | grep profile
1 root root 1459
Nov 12 2010
profile
drwxr-xr-x.
2 root root 4096
Sep 4 14:06
profile.d
[root@localhost etc]# ll -a | grep rc
1 root root 2620
bashrc
1 root root 1596
Jan 12 2010
csh.cshrc
lrwxrwxrwx.
1 root root
11 Sep 3
00:46 init.d -> rc.d/init.d
1 root root 715
kshrc
1 root root
7 Sep 3
00:46 rc -> rc.d/rc
10 Sep 3
00:46 rc0.d -> rc.d/rc0.d
00:46 rc1.d -> rc.d/rc1.d
00:46 rc2.d -> rc.d/rc2.d
00:46 rc3.d -> rc.d/rc3.d
00:46 rc4.d -> rc.d/rc4.d
00:46 rc5.d -> rc.d/rc5.d
00:46 rc6.d -> rc.d/rc6.d
drwxr-xr-x. 10 root root 4096
Sep 3 00:46
rc.d
13 Sep 3
00:46 rc.local -> rc.d/rc.local
15 Sep 3
00:46 rc.sysinit -> rc.d/rc.sysinit
#檢視/etc/profile檔案
[root@localhost etc]# cat profile
# /etc/profile
# System wide environment and startup programs, for login
setup
# Functions and aliases go in /etc/bashrc
# It's NOT good idea to change this file unless you know what
you
# are doing. Much better way is to create custom.sh shell script
in
# /etc/profile.d/ to make custom changes to environment. This
will
# prevent need for merging in future updates.
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE
HISTCONTROL
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "$PS1" ]; then
. $i
else
. $i >/dev/null 2>&1
done
unset i
unset pathmunge
說明:
#為登入而設定的系統全局環境和啟動程式,
#函數和别名放在/etc/bashrc
[root@localhost etc]# cat bashrc
# /etc/bashrc
# System wide functions and aliases
# Environment stuff goes in /etc/profile
# By default, we want this to get set.
# Even for non-interactive, non-login shells.
#
系統全局函數和别名
環境的配置放在/etc/profile
綜上,我們可以得出
linux /etc主目錄下包含以下2個檔案,1個目錄(及其它本文不關注的檔案)
/etc/profile
/etc/bashrc
/etc/pfofile.d/目錄
預設情況下,這些檔案的設定,僅對系統中所有使用者起作用,即作用域為全局
/etc/profile:系統為所有使用者設定全局預設環境(比如path環境變量)和啟動程式的配置檔案,并從/etc/profile.d目錄的配置檔案中搜集shell的設定
/bashrc:系統為所有運作bash
shell的使用者設定全局資源
(比如系統全局函數,變量和指令别名等)的配置檔案(注意:該檔案是針對bash
4、
檔案執行順序
/etc目錄:/etc/profile,/etc/bashrc
~主目錄:~/.bash_pfoile,~/.bash_login,~/.profile,~/.bashrc,~/.bash_logout
注:不一定每個linux作業系統的~主目錄中都存在上述列出的所有檔案
這些檔案具體的執行順序是???執行順序和bash
shell的類型有關,是以先來了解下bash
shell的類型
login
shell
以下情形中的取得的bash,稱為login
shell:
字元界面下,在終端tty1~tty6,通過輸入帳号,密碼登入,取得的bash
通過ssh,xshell,putty等工具連接配接系統,取得的bash
字元界面下,通過指令su
-、su
–l、su
--login等取得的bash
interactive
以下情形中的取得的bash,稱為interactive
可視桌面下,通過建立一個終端(Applications->System
Tools->Terminal)取得的bash
字元界面下,通過指令bash
取得的bash
字元界面下,通過指令su、su
username取得的bash(注意:此處su不帶
–
選項)
為何要分login
shell和interactive
shell?
最初的設計是這樣考慮的,如果從字元終端登入或者遠端登入,那麼login
Shell是該使用者的所有其它程序的父程序,也是其它子Shell的父程序,是以環境變量在login
Shell的啟動腳本裡設定一次就可以作用于其它非login
Shell裡,但是login
Shell的本地變量、函數、别名等設定沒有辦法作用于子Shell,需要每次啟動非login
Shell時設定一遍,是以就需要有非login
Shell的啟動腳本
非login
shell
有它特定的用途,比如一個用Linux搭建一個ftp伺服器,并且建立了很多的ftp使用者,那麼就可以将這些使用者的預設shell改為nologin,這樣一來,這些雖然是Linux上的使用者可是卻無法登入進Linux主機,隻能登入ftp伺服器了
怎麼區分login
shell?
[root@localhost ~]# su -
[root@localhost ~]# echo $0
-bash
[root@localhost ~]# bash
bash
說明:echo
$0 –>輸出結果:-bash
表明此時的bash為login
shell,bash
則表明此時的bash為interactive
login shell下的檔案執行順序
A.
當bash以login
shell的方式啟動時:
1、如果存在/etc/profile檔案,它先讀取檔案/etc/profile,并執行該檔案中的指令
2、然後查找~/.bash_profile,
~/.bash_login,
和
~/.profile,
按~/.bash_profile
-> ~/.bash_login -> ~/.profile的順序,從第一個存在且可讀的檔案中讀取指令并執行(注意:僅在3個檔案按順序讀取一個).
注意:
通過--noprofile選項可強制bash不讀取上面的任意檔案
作者:授客
QQ:1033553122
全國軟體測試QQ交流群:7156436
Git位址:https://gitee.com/ishouke
友情提示:限于時間倉促,文中可能存在錯誤,歡迎指正、評論!
作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額随意,您的支援将是我繼續創作的源動力,打賞後如有任何疑問,請聯系我!!!
微信打賞
支付寶打賞 全國軟體測試交流QQ群