深入了解定制Bash
操作系統(tǒng)的最外層 —— 也就是跟你直接打交道的 —— 叫做 shell(“外殼”)。Fedora 預(yù)裝了好幾種不同的 shell。shell 可以是圖形界面,或者字符界面。在文檔中,你常常能見到兩個(gè)母縮寫詞 GUI (圖形用戶界面Graphical User Interface)跟 CLI(命令行界面Command-Line Interface),它們用來區(qū)分圖形和基于字符的 shell/界面。GNOME 和 Bash 分別是 Fedora 默認(rèn)的圖形和命令行界面,不過你也可以使用其它 GUI 或者 CLI shell。
接下來在這篇文章中,我們會(huì)討論一些比較推薦的 Bash 字符界面的點(diǎn)文件配置。
Bash 參考手冊(cè)中寫道:
除了能使用其它程序之外,Bash shell 還含有一些內(nèi)置命令和關(guān)鍵字。Bash 內(nèi)置功能很強(qiáng)大,甚至能夠作為一門 高級(jí)語言 獨(dú)當(dāng)一面。Bash 的幾個(gè)關(guān)鍵字和操作符類似于 C 語言。
Bash 能夠以交互式或非交互式模式啟動(dòng)。Bash 的交互模式是一個(gè)很多人都熟悉的典型的終端/命令行界面。GNOME 終端 默認(rèn)以交互模式打開 Bash。Bash 在非交互模式下運(yùn)行的例子是,當(dāng)命令和數(shù)據(jù)從文件或 shell 腳本通過 管道 傳送到 Bash 時(shí)。其它 Bash 可以運(yùn)行的模式包括:登錄login、非登錄non-login、遠(yuǎn)程remote、POSIX、Unix sh、受限r(nóng)estricted,以及使用與用戶不同的 UID/GID 模式。各種模式是可以相互組合的。比如,交互式 + 受限 + POSIX 或者非交互式 + 非登錄 + 遠(yuǎn)程。不同的啟動(dòng)模式,決定著 Bash 所讀取的啟動(dòng)文件。理解這些操作模式,有助于幫助我們修改啟動(dòng)文件。
根據(jù) Bash 參考手冊(cè),它會(huì):
當(dāng)用戶開啟終端模擬器進(jìn)入命令行環(huán)境時(shí),便啟動(dòng)了一次交互式 shell 會(huì)話。GNOME 終端默認(rèn)以非登錄模式為用戶打開 Shell。你可以在 “編輯 → 首選項(xiàng) → 配置文件 → 命令Edit → Preferences → Profilles → Command” 中配置 GNOME 終端以何種模式(登錄與非登錄式)啟動(dòng)。也可以在 Bash 啟動(dòng)時(shí)通過向其傳遞 -login 標(biāo)志來要求進(jìn)入登錄模式。要注意一點(diǎn),Bash 的登錄模式與非交互模式并不互斥。可以讓 Bash 同時(shí)以登錄模式和非交互模式運(yùn)行。
除非傳入 -noprofile 選項(xiàng),否則登錄模式的 Bash shell 會(huì)默認(rèn)讀取并執(zhí)行某些初始化文件中命令。如果 /etc/profile 存在,它會(huì)是第一個(gè)被執(zhí)行的文件,緊接著是按 ~/.bash_profile、~/.bash_login 或 ~/.profile順序找到的第一個(gè)文件。當(dāng)用戶退出登錄模式的 shell 時(shí),或者有腳本在非交互式登錄模式的 shell 中調(diào)用了內(nèi)置 exit命令,Bash 會(huì)讀取并執(zhí)行 ~/.bash_logout 中的命令,如果 /etc/bash_logout 存在的話,會(huì)緊接著執(zhí)行它。通常來說,/etc/profile 會(huì)援引source /etc/bashrc 文件,讀取并執(zhí)行其中的命令,然后查找并讀取執(zhí)行 /etc/profile.d 目錄中以 .sh 結(jié)尾的文件。同樣的,~/.bash_profile 通常也會(huì)援引source ~/.bashrc 文件。/etc/bashrc 和 ~/.bashrc 都會(huì)進(jìn)行檢查,避免重復(fù)援引source。
一個(gè)交互式的 shell,如果不是登錄 shell,那么當(dāng)它第一次被調(diào)用的時(shí)候,會(huì)執(zhí)行 ~/.bashrc 文件。這是用戶在 Fedora 上打開終端時(shí)通常會(huì)進(jìn)入的 shell 類型。當(dāng) Bash 以非交互模式啟動(dòng) —— 就像運(yùn)行腳本時(shí)那樣 —— 它會(huì)尋找 BASH_ENV環(huán)境變量。如果找到了,就會(huì)展開它的值作為文件名,接著讀取并執(zhí)行該文件。效果跟執(zhí)行以下命令相同:
值得注意的是,不會(huì)使用 PATH 環(huán)境變量的值來搜索該文件名(LCTT 譯注:意即不會(huì)檢索搜索路徑)。
Bash 最廣為人知的用戶點(diǎn)文件是 ~/.bashrc。通過編輯該文件,可以設(shè)置大多數(shù)個(gè)性化選項(xiàng)。由于我們常常需要設(shè)置一些選項(xiàng),會(huì)改動(dòng)上面提及甚至沒有提及的文件,所以大部分自定義選項(xiàng)會(huì)成為一個(gè)麻煩事。Bash 環(huán)境具有很高的可定制性,正是為了適應(yīng)不同用戶的不同需求。
當(dāng)?shù)卿?shell 正常退出時(shí),如果 ~/.bash_logout 和 /etc/bash_logout 存在,它們會(huì)被調(diào)用。下一幅圖展示了 Bash 作為交互式 shell 啟動(dòng)時(shí)的過程。例如,當(dāng)用戶從桌面環(huán)境打開終端模擬器時(shí),會(huì)按照以下順序進(jìn)行。
我們已經(jīng)知道,在不同的啟動(dòng)模式下,Bash 會(huì)執(zhí)行不同的命令,所以很明顯,只有幾種最需要關(guān)注的典型啟動(dòng)模式。分別是非交互、交互式登錄 shell,和非交互式、交互式非登錄 shell。如果想定義某些全局環(huán)境,那么需要將一個(gè)具有唯一名稱、以 .sh 為后綴的文件(例如 custom.sh)放置在 /etc/profile.d 目錄。
對(duì)于非交互式非登錄啟動(dòng)方式,需要特別注意。在這種模式下,Bash 會(huì)檢查 BASH_ENV 變量。如果定義了該變量,Bash 會(huì)援引它所指向的文件。另外,處理 BASH_ENV 時(shí)并不會(huì)使用 PATH 變量所存儲(chǔ)的值(LCTT 譯注:意即不會(huì)檢索搜索路徑),所以它必須包含執(zhí)行文件的絕對(duì)路徑。比如說,如果有人希望非交互式執(zhí)行腳本時(shí),shell 能讀取 ~/.bashrc 文件中的設(shè)置,那么他可以把類似下面這樣的內(nèi)容放在一個(gè)名為 /etc/profile.d/custom.sh 的文件中...
上面這份腳本會(huì)讓每個(gè) shell 腳本在運(yùn)行之前先執(zhí)行該用戶的 ~/.bashrc。
用戶一般都會(huì)自定義他們的系統(tǒng)環(huán)境,以便契合他們自己的工作習(xí)慣與偏好。舉例來說,用戶可以通過別名來實(shí)現(xiàn)這種程度的自定義。擁有相同起始參數(shù)、需要頻繁使用的命令是制作別名的最佳選擇。以下展示了一些來自 ~/.bashrc 文件中定義的別名。
在系統(tǒng)中,別名是一種自定義各種命令的方法。它能減少擊鍵次數(shù),而且讓命令用起來更方便。針對(duì)用戶級(jí)別的別名通常存放在該用戶的 ~/.bashrc 文件中。
如果你發(fā)現(xiàn)自己經(jīng)常要去歷史中查找曾經(jīng)執(zhí)行過的某條命令,那可能需要改改歷史設(shè)置了。你依然可以在 ~/.bashrc 文件中設(shè)置針對(duì)用戶級(jí)別的歷史選項(xiàng)。比如說,如習(xí)慣同時(shí)使用多個(gè)終端,那你可能要啟用 histappend 選項(xiàng)。某些 Bash 相關(guān)的 shell 選項(xiàng)本質(zhì)上是布爾值(接收 on 或 off),通??梢杂脙?nèi)置命令 shopt 啟用或禁用。接收更復(fù)雜的值的 Bash 選項(xiàng)(如 HISTTIMEFORMAT),常常通過賦值給環(huán)境變量來達(dá)到配置目的。以下演示如何以 shell 選項(xiàng)和環(huán)境變量定制 Bash。
上面例子中的 direxpand 選項(xiàng),可以讓 Bash 在文件名補(bǔ)全時(shí),用單詞展開結(jié)果替換目錄名。它會(huì)改變 readline 編輯緩沖區(qū)的內(nèi)容,所以你所輸入的東西已經(jīng)被補(bǔ)全得到的結(jié)果替換了。
HISTCON TROL 變量用于啟用或禁用命令歷史的某些過濾選項(xiàng)。重復(fù)行、以空白打頭的行,都能通過該選項(xiàng)將它們從命令歷史中過濾掉。引用自 Dusty Mabe,這是我從他那兒得到的技巧:
對(duì)于命令行重度用戶,Bash 有一個(gè) CDPATH 環(huán)境變量。如果 CDPATH 包含一系列供 cd 命令搜索的目錄,且提供一個(gè)相對(duì)路徑作為第一個(gè)參數(shù),那么它會(huì)按順序檢查所有列出的目錄,尋找匹配的子目錄并切換到第一個(gè)匹配結(jié)果目錄。
CDPATH 通常像 PATH 一樣的方式進(jìn)行更新 —— 通過在賦值右側(cè)引用自身來保留原來的值。
PATH 是另一個(gè)極其重要的變量。它是系統(tǒng)上的命令的搜索路徑。注意,有些應(yīng)用要求將它們自己的目錄加入 PATH 變量,這樣才能正常使用。跟 CDPATH 一樣,通過在賦值右側(cè)引用原值來追加新值到 PATH 變量。如果你希望將新值前置,只需要把原來的值($PATH)放到列表末尾即可。還有注意的是在 Fedora,這一列值通過冒號(hào)分隔(:)。
命令提示符是另一個(gè)流行的自定義選項(xiàng)。它有七個(gè)可定制的參數(shù):
Bash 的這一個(gè)方面就可以用整篇文章來討論。你可以找到許許多多信息和例子。在本文末尾鏈接的存儲(chǔ)庫中提供了一些點(diǎn)文件范例,包括提示符重新配置。你可以隨意使用該存儲(chǔ)庫中的例子進(jìn)行學(xué)習(xí)和體驗(yàn)。
既然你已經(jīng)掌握了一些 Bash 的工作原理,那就可以輕松修改你的 Bash 點(diǎn)文件,滿足你自己的需求和習(xí)慣。美化你的提示符,制作一些別名,這樣你的電腦才真的屬于你。查看 /etc/profile、/etc/bashrc 和 /etc/profile.d/ 這些文件的內(nèi)容,獲得一些啟發(fā)。
你也可以在這里寫一些關(guān)于終端模擬器的評(píng)論。有很多辦法可以將你最喜歡的終端,完全配置成你想要的樣子。你或許早就想到了,但是通??梢酝ㄟ^……嗯……用戶家目錄的點(diǎn)文件實(shí)現(xiàn)這個(gè)目的。終端模擬器也可以作為登錄會(huì)話啟動(dòng),有些人總喜歡用登錄環(huán)境。你使用終端和電腦的姿勢(shì),取決于你如何修改(或不修改)你的點(diǎn)文件。
如果你很好奇自己的命令行處于什么會(huì)話狀態(tài),使用下面這個(gè)腳本來判斷一下。
把這幾行放到一個(gè)文件里,加上可執(zhí)行權(quán)限,然后運(yùn)行,就能看到你當(dāng)前處于何種類型的 shell。$- 在 Bash 中是一個(gè)變量,如果是交互式 shell,它會(huì)包含字母 i。此外,你可以直接輸出 $- 變量然后檢查它的輸出中是否含有 i 標(biāo)記。
可以參考以下資料以獲取更多信息和示例。Bash 手冊(cè)也是一個(gè)很好的信息來源。請(qǐng)注意,確保你的本地手冊(cè)頁記錄了你當(dāng)前運(yùn)行的 Bash 版本的特性,因?yàn)樵诰W(wǎng)上找到的信息有時(shí)可能太老(過時(shí)了)或太新(你的系統(tǒng)還沒有安裝)。
-
https://opensource.com/tags/command-line
https://opensource.com/downloads/bash-cheat-sheet(在該網(wǎng)站中,你必須要輸入一個(gè)有效的電子郵箱地址,或者注冊(cè),才能下載。)
https://opensource.com/article/19/12/bash-script-template
對(duì)本文有各種形式(點(diǎn)文件示例、提示,以及腳本文件)貢獻(xiàn)的社區(qū)成員:
-
Micah Abbott – 首席質(zhì)量工程師
John Lebon – 首席軟件工程師
Dusty Mabe – 首席軟件工程師
Colin Walters – 高級(jí)首席軟件工程師
示例點(diǎn)文件和腳本可以在這個(gè)存儲(chǔ)庫中找到:
-
https://github.com/TheOneandOnlyJakfrost/bash-article-repo
請(qǐng)仔細(xì)檢查上面所提供的存儲(chǔ)庫中的信息。有些可能已經(jīng)過時(shí)了。里面還包含很多開發(fā)中的自定義腳本和寵物容器pet container配置例子,那些不是點(diǎn)文件。我推薦從 John Lebon 的點(diǎn)文件開始學(xué)習(xí),從頭到尾都含有完善的解說,它們是我見過的最詳細(xì)的,并且包含了非常好的描述。祝你學(xué)得開心!
聲明:免責(zé)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),也不承認(rèn)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,請(qǐng)發(fā)
送郵件至:operations@xinnet.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。本站原創(chuàng)內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)
需注明出處:新網(wǎng)idc知識(shí)百科