1. 程式人生 > >鳥哥的Linux私房菜(基礎篇)- 第十一章、認識與學習 BASH

鳥哥的Linux私房菜(基礎篇)- 第十一章、認識與學習 BASH

你是否會覺得奇怪,怎麼我們什麼動作都沒有進行,但是一進入 bash 就取得一堆有用的變量了?這是因為系統有一些環境配置檔案案的存在,讓 bash 在啟動時直接讀取這些配置檔案,以規劃好 bash 的操作環境啦!而這些配置檔案又可以分為全體系統的配置檔案以及使用者個人偏好配置檔案。要注意的是,我們前幾個小節談到的命令別名啦、自定義的變數啦,在你登出 bash 後就會失效,所以你想要保留你的配置,就得要將這些配置寫入配置檔案才行。底下就讓我們來聊聊吧!

  • login 與 non-login shell

在開始介紹 bash 的配置檔案前,我們一定要先知道的就是 login shell 與 non-login shell!重點在於有沒有登陸 (login) 啦!

  • login shell:取得 bash 時需要完整的登陸流程的,就稱為 login shell。舉例來說,你要由 tty1 ~ tty6 登陸,需要輸入使用者的賬號與密碼,此時取得的 bash 就稱為『 login shell 』囉;

  • non-login shell:取得 bash 介面的方法不需要重複登陸的舉動,舉例來說,(1)你以 X window 登陸 Linux 後,再以 X 的圖形化介面啟動終端機,此時那個終端介面並沒有需要再次的輸入賬號與密碼,那個 bash 的環境就稱為non-login shell了。(2)你在原本的 bash 環境下再次下達 bash 這個命令,同樣的也沒有輸入賬號密碼,那第二個 bash (子程式) 也是 non-login shell 。

為什麼要介紹 login, non-login shell 呢?這是因為這兩個取得 bash 的情況中,讀取的配置檔案資料並不一樣所致。由於我們需要登陸系統,所以先談談 login shell 會讀取哪些配置檔案?一般來說,login shell 其實只會讀取這兩個配置檔案:

  1. /etc/profile:這是系統整體的配置,你最好不要修改這個檔案;
  2. ~/.bash_profile 或 ~/.bash_login 或 ~/.profile:屬於使用者個人配置,你要改自己的資料,就寫入這裡!

那麼,就讓我們來聊一聊這兩個檔案吧!這兩個檔案的內容可是非常繁複的喔!

  • /etc/profile (login shell 才會讀)

你可以使用 vim 去閱讀一下這個檔案的內容。這個配置檔案可以利用使用者的識別符號 (UID) 來決定很多重要的變數資料,這也是每個使用者登陸取得 bash 時一定會讀取的配置檔案!所以如果你想要幫所有使用者配置整體環境,那就是改這裡囉!不過,沒事還是不要隨便改這個檔案喔這個檔案配置的變數主要有:

  • PATH:會依據 UID 決定 PATH 變數要不要含有 sbin 的系統命令目錄;
  • MAIL:依據賬號配置好使用者的 mailbox 到 /var/spool/mail/賬號名;
  • USER:根據使用者的賬號配置此一變數內容;
  • HOSTNAME:依據主機的 hostname 命令決定此一變數內容;
  • HISTSIZE:歷史命令記錄筆數。CentOS 5.x 配置為 1000 ;

/etc/profile 可不止會做這些事而已,他還會去呼叫外部的配置資料喔!在 CentOS 5.x 預設的情況下,底下這些資料會依序的被呼叫進來:

  • /etc/inputrc

    其實這個檔案並沒有被執行啦!/etc/profile 會主動的判斷使用者有沒有自定義輸入的按鍵功能,如果沒有的話, /etc/profile就會決定配置『INPUTRC=/etc/inputrc』這個變數!此一檔案內容為 bash 的熱鍵啦、[tab]要不要有聲音啦等等的資料!因為鳥哥覺得 bash 預設的環境已經很棒了,所以不建議修改這個檔案!

  • /etc/profile.d/*.sh

    其實這是個目錄內的眾多檔案!只要在 /etc/profile.d/ 這個目錄內且副檔名為 .sh ,另外,使用者能夠具有 r 的許可權,那麼該檔案就會被 /etc/profile 呼叫進來。在 CentOS 5.x 中,這個目錄底下的檔案規範了 bash 操作介面的顏色、語系、ll 與 ls 命令的命令別名、vi 的命令別名、which 的命令別名等等。如果你需要幫所有使用者配置一些共享的命令別名時,可以在這個目錄底下自行建立副檔名為 .sh 的檔案,並將所需要的資料寫入即可喔!

  • /etc/sysconfig/i18n

    這個檔案是由 /etc/profile.d/lang.sh 呼叫進來的!這也是我們決定 bash 預設使用何種語系的重要配置檔案!檔案裡最重要的就是 LANG 這個變數的配置啦!我們在前面的locale 討論過這個檔案囉!自行回去瞧瞧先!

反正你只要記得,bash 的 login shell 情況下所讀取的整體環境配置檔案其實只有 /etc/profile,但是 /etc/profile 還會呼叫出其他的配置檔案,所以讓我們的 bash 操作介面變的非常的友善啦!接下來,讓我們來瞧瞧,那麼個人偏好的配置檔案又是怎麼回事?

  • ~/.bash_profile (login shell 才會讀)

bash 在讀完了整體環境配置的 /etc/profile 並藉此呼叫其他配置檔案後,接下來則是會讀取使用者的個人配置檔案。在 login shell 的 bash 環境中,所讀取的個人偏好配置檔案其實主要有三個,依序分別是:

  1. ~/.bash_profile
  2. ~/.bash_login
  3. ~/.profile

其實 bash 的 login shell 配置只會讀取上面三個檔案的其中一個,而讀取的順序則是依照上面的順序。也就是說,如果 ~/.bash_profile 存在,那麼其他兩個檔案不論有無存在,都不會被讀取。如果 ~/.bash_profile 不存在才會去讀取 ~/.bash_login,而前兩者都不存在才會讀取 ~/.profile 的意思。會有這麼多的檔案,其實是因應其他 shell 轉換過來的使用者的習慣而已。先讓我們來看一下 root 的 /root/.bash_profile 的內容是怎樣呢?

[[email protected] ~]# cat ~/.bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then   <==底下這三行在判斷並讀取 ~/.bashrc
        . ~/.bashrc
fi

# User specific environment and startup programs
PATH=$PATH:$HOME/bin        <==底下這幾行在處理個人化配置
export PATH
unset USERNAME

這個檔案內有配置 PATH 這個變數喔!而且還使用了 export 將 PATH 變成環境變數呢!由於 PATH 在 /etc/profile 當中已經配置過,所以在這裡就以累加的方式新增使用者家目錄下的 ~/bin/ 為額外的執行檔案放置目錄。這也就是說,你可以將自己建立的執行檔放置到你自己家目錄下的 ~/bin/ 目錄啦!那就可以直接執行該執行檔而不需要使用絕對/相對路徑來執行該檔案。

這個檔案的內容比較有趣的地方在於 if ... then ... 那一段!那一段程式程式碼我們會在第十三章 shell script 談到,假設你現在是看不懂的。該段的內容指的是『判斷家目錄下的 ~/.bashrc 存在否,若存在則讀入 ~/.bashrc 的配置』。bash 配置檔案的讀入方式比較有趣,主要是透過一個命令『 source 』來讀取的!也就是說 ~/.bash_profile 其實會再呼叫 ~/.bashrc 的配置內容喔!最後,我們來看看整個 login shell的讀取流程:

login shell 的配置檔案讀取流程
圖 4.3.1、login shell 的配置檔案讀取流程

實線的的方向是主線流程,虛線的方向則是被呼叫的配置檔案!從上面我們也可以清楚的知道,在 CentOS 的 login shell 環境下,最終被讀取的配置檔案是『 ~/.bashrc 』這個檔案喔!所以,你當然可以將自己的偏好配置寫入該檔案即可。底下我們還要討論一下 source 與 ~/.bashrc 喔!

  • source :讀入環境配置檔案的命令

由於 /etc/profile 與 ~/.bash_profile 都是在取得 login shell 的時候才會讀取的配置檔案,所以,如果你將自己的偏好配置寫入上述的檔案後,通常都是得登出再登陸後,該配置才會生效。那麼,能不能直接讀取配置檔案而不登出登陸呢?可以的!那就得要利用 source 這個命令了!

[[email protected] ~]# source 配置檔案檔名

範例:將家目錄的 ~/.bashrc 的配置讀入目前的 bash 環境中
[[email protected] ~]# source ~/.bashrc  <==底下這兩個命令是一樣的!
[[email protected] ~]#  .  ~/.bashrc

利用 source 或小數點 (.) 都可以將配置檔案的內容讀進來目前的 shell 環境中!舉例來說,我修改了 ~/.bashrc ,那麼不需要登出,立即以 source ~/.bashrc 就可以將剛剛最新配置的內容讀進來目前的環境中!很不錯吧!還有,包括 ~/bash_profile 以及 /etc/profile 的配置中,很多時候也都是利用到這個 source (或小數點) 的功能喔!

有沒有可能會使用到不同環境配置檔案的時候?有啊!最常發生在一個人的工作環境分為多種情況的時候了!舉個例子來說,在鳥哥的大型主機中,常常需要負責兩到三個不同的案子,每個案子所需要處理的環境變數訂定並不相同,那麼鳥哥就將這兩三個案子分別編寫屬於該案子的環境變數配置檔案案,當需要該環境時,就直接『source 變數檔案 』,如此一來,環境變數的配置就變的更簡便而靈活了!

  • ~/.bashrc (non-login shell 會讀)

談完了 login shell 後,那麼 non-login shell 這種非登陸情況取得 bash 操作介面的環境配置檔案又是什麼?當你取得 non-login shell 時,該 bash 配置檔案僅會讀取 ~/.bashrc 而已啦!那麼預設的 ~/.bashrc 內容是如何?

[[email protected] ~]# cat ~/.bashrc
# .bashrc

# User specific aliases and functions
alias rm='rm -i'             <==使用者的個人配置
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then  <==整體的環境配置
        . /etc/bashrc
fi

特別注意一下,由於 root 的身份與一般使用者不同,鳥哥是以 root 的身份取得上述的資料,如果是一般使用者的 ~/.bashrc 會有些許不同。看一下,你會發現在 root 的 ~/.bashrc 中其實已經規範了較為保險的命令別名了。此外,咱們的 CentOS 5.x 還會主動的呼叫 /etc/bashrc 這個檔案喔!為什麼需要呼叫 /etc/bashrc 呢?因為/etc/bashrc 幫我們的 bash 定義出底下的資料:

  • 依據不同的 UID 規範出 umask 的值;
  • 依據不同的 UID 規範出提示字元 (就是 PS1 變數);
  • 呼叫 /etc/profile.d/*.sh 的配置

你要注意的是,這個 /etc/bashrc 是 CentOS 特有的 (其實是 Red Hat 系統特有的),其他不同的 distributions 可能會放置在不同的檔名就是了。由於這個 ~/.bashrc 會呼叫 /etc/bashrc 及 /etc/profile.d/*.sh ,所以,萬一你沒有 ~/.bashrc (可能自己不小心將他刪除了),那麼你會發現你的 bash 提示字元可能會變成這個樣子:

-bash-3.2$ 

不要太擔心啦!這是正常的,因為你並沒有呼叫 /etc/bashrc 來規範 PS1 變數啦!而且這樣的情況也不會影響你的 bash 使用。如果你想要將命令提示字元捉回來,那麼可以複製 /etc/skel/.bashrc 到你的家目錄,再修訂一下你所想要的內容,並使用 source 去呼叫 ~/.bashrc ,那你的命令提示字元就會回來啦!

  • 其他相關配置檔案

事實上還有一些配置檔案可能會影響到你的 bash 操作的,底下就來談一談:

  • /etc/man.config

    這個檔案乍看之下好像跟 bash 沒相關性,但是對於系統管理員來說,卻也是很重要的一個檔案!這的檔案的內容『規範了使用man 的時候, man page 的路徑到哪裡去尋找!』所以說的簡單一點,這個檔案規定了下達man 的時候,該去哪裡檢視資料的路徑配置!

    那麼什麼時候要來修改這個檔案呢?如果你是以tarball 的方式來安裝你的資料,那麼你的 man page 可能會放置在/usr/local/softpackage/man 裡頭,那個 softpackage 是你的套件名稱,這個時候你就得以手動的方式將該路徑加到 /etc/man.config 裡頭,否則使用 man 的時候就會找不到相關的說明檔囉。

    事實上,這個檔案內最重要的其實是 MANPATH 這個變數配置啦!我們搜尋 man page 時,會依據 MANPATH 的路徑去分別搜尋啊!另外,要注意的是,這個檔案在各大不同版本 Linux distributions 中,檔名都不太相同,例如 CentOS 用的是/etc/man.config ,而 SuSE 用的則是 /etc/manpath.config ,可以利用 [tab] 按鍵來進行檔名的補齊啦!

  • ~/.bash_history

    還記得我們在歷史命令提到過這個檔案吧?預設的情況下,我們的歷史命令就記錄在這裡啊!而這個檔案能夠記錄幾筆資料,則與 HISTFILESIZE這個變數有關啊。每次登陸 bash 後,bash 會先讀取這個檔案,將所有的歷史命令讀入記憶體,因此,當我們登陸 bash 後就可以查知上次使用過哪些命令囉。至於更多的歷史命令,請自行回去參考喔!

  • ~/.bash_logout

    這個檔案則記錄了『當我登出 bash 後,系統再幫我做完什麼動作後才離開』的意思。你可以去讀取一下這個檔案的內容,預設的情況下,登出時, bash 只是幫我們清掉螢幕的資訊而已。不過,你也可以將一些備份或者是其他你認為重要的工作寫在這個檔案中 (例如清空快取盤),那麼當你離開 Linux 的時候,就可以解決一些煩人的事情囉!

相關推薦

Linux私房(基礎)- 認識學習 BASH

你是否會覺得奇怪,怎麼我們什麼動作都沒有進行,但是一進入 bash 就取得一堆有用的變量了?這是因為系統有一些環境配置檔案案的存在,讓 bash 在啟動時直接讀取這些配置檔案,以規劃好 bash 的操作環境啦!而這些配置檔案又可以分為全體系統的配置檔案以及使用者個人偏好配置檔案。要注意的是,我們前幾個小節

Linux私房基礎 正則表示式檔案格式化處理

1. 正則的概念 正則表示式就是處理字串的方法,他是以行為單位來進行字串的處理行為, 正則表示式通過一些特殊符號的輔助,可以讓使用者輕易的達到“搜尋/刪除/取代”某特定字串的處理程式! 2. 基礎

思維導圖之《Linux私房基礎-三版》

原文連結:http://www.jianshu.com/p/ec06e1ace0bd 說明 使用思維導圖 Mindjet MindManager 製作的《鳥哥的Linux私房菜基礎篇-第三版》學習筆記。 整體結構 個人計算機架構 (adsbygoogle

Linux私房基礎三版 -- 目錄

伺服器端使用的OS,Linux是最最常用的,所以,日常的部署、排查問題,就不可避免的與Linux打交道,日積月累,對Linux就有了多多少少的瞭解。 反過來,再系統的從頭開始,讀一本關於Linux基礎的書籍,可以進行知識的串聯,把一些原先“知道其然”的東西,進化成“知其所

Linux私房(基礎)- Linux 磁碟檔案系統管理

在第六章當中我們介紹過 Linux 的檔案除了原有的資料內容外,還含有非常多的許可權與屬性,這些許可權與屬性是為了保護每個使用者所擁有資料的隱密性。而前一小節我們知道 filesystem 裡面可能含有的 inode/block/superblock等。為什麼要談這個呢?因為標準的 Linux 檔案系

私房基礎讀書筆記

1、電腦or伺服器,是由一堆硬體組成,不同的硬體提供不同的功能,主要的有cpu、記憶體、硬碟、網絡卡、顯示卡、音效卡等,其中cpu是核心計算單元,記憶體是給cpu直接輸送資料的,硬碟是儲存資料的,網絡卡是提供網路服務的,顯示卡則提供圖形介面的顯示效果;cpu的控制單元來控制

Linux私房知識點總結3到5

centos 啟動 學會 運行 lin inux 格式 開機流程 十分鐘 感覺自己對Linux的理解一直不夠,所以近期翻看了一本《鳥哥的Linux私房菜》。這是一本基礎的書,萬丈高樓平地起,會的不多但能夠學。這是我整理的一些知識點,盡管非常基礎。希望和大家共同交流。

Linux私房知識點總結0到2

感覺自己對Linux的理解一直不夠,所以最近翻看了一本《鳥哥的Linux私房菜》。這是一本基礎的書,萬丈高樓平地起,會的不多但可以學。這是我整理的一些知識點,雖然很基礎。希望和大家共同交流。 第0章計算機概述 1、計算機主要有三大部分組成:a.輸入部分,包括鍵盤,滑鼠。

Linux私房知識點總結8到9

最近翻看了一本《鳥哥的Linux私房菜》。這是一本基礎的書,萬丈高樓平地起,會的不多但可以學。這是我整理的一些知識點,雖然很基礎。希望和大家共同交流。第8章Linux磁碟與檔案系統管理 一、Linux磁碟管理 1、檔案系統通常會將兩部分資料分別放在不同的塊中,許可權與屬性放

Linux私房知識點總結6到7

最近翻看了一本《鳥哥的Linux私房菜》。這是一本基礎的書,萬丈高樓平地起,會的不多但可以學。這是我整理的一些知識點,雖然很基礎。希望和大家共同交流。 第6章主機規劃與磁碟分割槽 1、在進行團隊開發資源時,使用者組是很有用的一個功能。 2、Linux檔案屬性, 如:-r

java語言程式設計基礎程式設計練習題

1 package yongheng; import java.util.Scanner; public class Main { public static void main(String agrs[]){ Triangle t

Linux私房基礎Linux 檔案目錄管理

絕對路徑:『一定由根目弽 / 寫起』;相對路徑:『不是由 / 寫起』 特殊目錄有:., .., -, ~, ~account需要注意; 與目錄相關的指令有:cd, mkdir, rmdir, pwd 等重要指令; rmdir 僅能刪除空目錄,要刪除非空目錄需使用『 rm

Linux私房——Linux基本命令(二)

一、Linux命令格式 command   [-options]   parameter1  parameter2 1、command:指令名,相應功能的單詞縮寫。 2、[-options]:選項,可對命令進行控制,中括號[ ]並不存在於實際的命令中,而加入引數設定時,

叔的Linux私房基礎-學習筆記()

一行指令中第一個輸入的部分絕對是“指令(command)”或“可可執行檔案案(例如批次指令碼,script)” command 為指令的名稱,例如變換工作目錄的指令為 cd 等等; 中刮號[]並不存在於實際的指令中,而加入選項設定時,通常選項前會帶 - 號,例如 -h;有時候會使用選項的完整全名,則選 項前

叔的Linux私房基礎-學習筆記(二)

超簡單文字編輯器:nano 比較重要的幾個組合按鍵 正確的關機方法 觀察系統的使用狀態 : 下達"who"指令檢視誰還在線上 下達"netstat -a’'指令檢視網路連線狀態 下達"ps -aux"指令,看背景執行的程式 正確的關機指令使用 :

Linux私房(伺服器)- 遠端聯機伺服器SSH / XDMCP / VNC / RDP

由於我們 Linux 使用的圖形介面是所謂的 X-Window System 的東西,這玩意兒是能夠跨平臺的,目前在 Linux 上頭開發的圖形介面軟體,幾乎都是使用這個 X 的架構來處理,所以囉,你就不能夠不知道 X Window 啦! 我們在基礎篇第三版的二十四章已經講過 X Window 啦,

Linux私房》——首次登陸線上求助 man page

linux命令(不支援簡寫): 1、init 3  DOS介面     init 5 圖形化介面  (root下操作)       startx  開啟圖形化介面 2、命令列輸入規則:命令  -選項...  引數    3、ls         列出目錄裡的內容(當前)

Linux私房》——計算器概論

一、計算機 (接受使用者輸入指令與資料, 經由中央處理器的數學和邏輯單元運算處理後,以產生或儲存成有用資訊) 1、計算機硬體的五大單元。      輸入單元、輸出單元、cpu內部的控制單元、算數邏輯單元和主儲存器。        2、CPU的種類。     根據設

Linux私房》——Linux磁碟檔案系統管理

1、ls -i(inode) xxx      xxx在inode中的編號          filefrag -v xxx       xxx檔案分佈在哪些block中      dumpe2fs  /dev/sda3      檢視sda3分割槽資訊 2、VFS  

Linux私房-讀後感想

背景介紹     鄙人成為碼農已兩年有餘,非科班。第一份工作有接觸Linux,只是簡單的檢視日誌、備份檔案和啟停服務等,對Linux瞭解不多。 第二份工作剛開始的時候,專案經理丟了本鳥哥的Linux私房菜的pdf檔案給我,讓我看看,說專案中經常要用到。剛看了幾頁就被鳥哥幽默的