自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深入了解定制Bash

系統(tǒng) Linux
操作系統(tǒng)的最外層 —— 也就是跟你直接打交道的 —— 叫做 shell(“外殼”)。Fedora 預(yù)裝了好幾種不同的 shell。shell 可以是圖形界面,或者字符界面。接下來在這篇文章中,我們會(huì)討論一些比較推薦的 Bash 字符界面的點(diǎn)文件配置。

[[334196]]

操作系統(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 概覽

Bash 參考手冊(cè)中寫道:

根本上來說,shell 只是一個(gè)能執(zhí)行命令的宏處理器。宏處理器這個(gè)詞意味著通過擴(kuò)展文本跟符號(hào),從而構(gòu)成更復(fù)雜的表達(dá)式。

Bash 參考手冊(cè) 第五版,Bash 5.0 2019 年 5 月

除了能使用其它程序之外,Bash shell 還含有一些內(nèi)置命令和關(guān)鍵字。Bash 內(nèi)置功能很強(qiáng)大,甚至能夠作為一門 高級(jí)語(yǔ)言 獨(dú)當(dāng)一面。Bash 的幾個(gè)關(guān)鍵字和操作符類似于 C 語(yǔ)言。

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、受限restricted,以及使用與用戶不同的 UID/GID 模式。各種模式是可以相互組合的。比如,交互式 + 受限 + POSIX 或者非交互式 + 非登錄 + 遠(yuǎn)程。不同的啟動(dòng)模式,決定著 Bash 所讀取的啟動(dòng)文件。理解這些操作模式,有助于幫助我們修改啟動(dòng)文件。

根據(jù) Bash 參考手冊(cè),它會(huì):

  1. 從文件中...、從作為 -c 調(diào)用選項(xiàng)傳入?yún)?shù)的字符...,或者從用戶的終端中讀取輸入。
  2. 將輸入分解成單詞和操作符,遵循 [它的] 引用規(guī)則。...這些標(biāo)記使用元字符隔開。這一步執(zhí)行別名展開。
  3. 將標(biāo)記解析成簡(jiǎn)單與復(fù)合命令。
  4. 執(zhí)行各種 shell 展開...,將展開之后的標(biāo)記分解成文件名...以及命令和參數(shù)的列表。
  5. 執(zhí)行必要的重定向...并從參數(shù)列表中去除重定向操作符及其操作數(shù)。
  6. 執(zhí)行命令。
  7. 必要時(shí)等待命令完成,并收集退出狀態(tài)。

Bash 參考文檔 第五版,Bash 版本 5.0 2019 年 5 月

當(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)行。

啟動(dòng) Bash

除非傳入 -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。

(LCTT 譯注:在 Bash 中,腳本會(huì)通過 source 或 . 命令來將另外一個(gè)腳本引入其中,這個(gè)行為稱之為 “source”、“sourcing”,但是該行為一直沒有公認(rèn)且常用的翻譯方法。經(jīng)過多番斟酌,我認(rèn)為可以譯做“援引”,理由如下:1、“援引”具有“引用、引入”的意思,符合該行為;2、“援”這個(gè)詞的發(fā)音和“source” 常見的漢語(yǔ)意思“源”同音,便于記憶。以上是我們的愚見,供大家參考討論。—— 老王,2020/7/19)

一個(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í)行以下命令相同:

  1. if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

值得注意的是,不會(huì)使用 PATH 環(huán)境變量的值來搜索該文件名(LCTT 譯注:意即不會(huì)檢索搜索路徑)。

重要的用戶點(diǎn)文件

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 的文件中...

  1. # custom.sh
  2. .
  3. .
  4. .
  5. # 如果使用 Fedora Workstation
  6. BASH_ENV="/home/username/.bashrc"
  7. .
  8. .
  9. .
  10. # 如果使用 Fedora Silverblue Workstation
  11. BASH_ENV="/var/home/username/.bashrc"
  12.  
  13. export BASH_ENV

上面這份腳本會(huì)讓每個(gè) shell 腳本在運(yùn)行之前先執(zhí)行該用戶的 ~/.bashrc。

用戶一般都會(huì)自定義他們的系統(tǒng)環(huán)境,以便契合他們自己的工作習(xí)慣與偏好。舉例來說,用戶可以通過別名來實(shí)現(xiàn)這種程度的自定義。擁有相同起始參數(shù)、需要頻繁使用的命令是制作別名的最佳選擇。以下展示了一些來自 ~/.bashrc 文件中定義的別名。

  1. # .bashrc
  2. # 執(zhí)行全局文件
  3. if [ -f /etc/bashrc ];
  4. then . /etc/bashrc
  5. fi
  6. .
  7. .
  8. .
  9. # 用戶別名和函數(shù)
  10. alias ls='ls -hF --color=auto'
  11. alias la='ls -ahF --color=auto'
  12.  
  13. # dir 命令用起來像在 Windows 那樣
  14. alias dir='ls --color=auto --format=long'
  15.  
  16. # 用顏色高亮 grep 結(jié)果
  17. alias grep='grep --color=auto'

在系統(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。

  1. # 配置 Bash 歷史
  2.  
  3. # 用制表符擴(kuò)展目錄環(huán)境變量,并設(shè)置 histappend
  4. shopt -s direxpand histappend
  5.  
  6. # ignoreboth 等同于 ignorespace ignoredup
  7. HISTCONTROL='ignoreboth'
  8.  
  9. # 控制 `history` 輸出中的時(shí)間格式
  10. HISTTIMEFORMAT="[%F %T] "
  11.  
  12. # 無限歷史記錄
  13. # NB:在新版 Bash 中,任何 < 0 的寫法都有效,但是在 CentOS/RHEL 中,只有這樣才行得通
  14. HISTSIZE=
  15. HISTFILESIZE=
  16.  
  17. # 或者對(duì)于使用新版 Bash 的人
  18. HISTSIZE=-1
  19. HISTFILESIZE=-1

上面例子中的 direxpand 選項(xiàng),可以讓 Bash 在文件名補(bǔ)全時(shí),用單詞展開結(jié)果替換目錄名。它會(huì)改變 readline 編輯緩沖區(qū)的內(nèi)容,所以你所輸入的東西已經(jīng)被補(bǔ)全得到的結(jié)果替換了。

HISTCONTROL 變量用于啟用或禁用命令歷史的某些過濾選項(xiàng)。重復(fù)行、以空白打頭的行,都能通過該選項(xiàng)將它們從命令歷史中過濾掉。引用自 Dusty Mabe,這是我從他那兒得到的技巧:

ignoredup 可以讓歷史不記錄重復(fù)條目(如果你反復(fù)執(zhí)行同一條命令)。ignorespace 會(huì)忽略前面有空白的條目,當(dāng)你在設(shè)置一個(gè)包含敏感信息的環(huán)境變量或者執(zhí)行一條不想被記錄進(jìn)磁盤的命令時(shí),這就很有用。ignoreboth相當(dāng)于這兩條選項(xiàng)的結(jié)合體。

Dusty Mabe – Redhat首席軟件工程師,2020.6.19

對(duì)于命令行重度用戶,Bash 有一個(gè) CDPATH 環(huán)境變量。如果 CDPATH 包含一系列供 cd 命令搜索的目錄,且提供一個(gè)相對(duì)路徑作為第一個(gè)參數(shù),那么它會(huì)按順序檢查所有列出的目錄,尋找匹配的子目錄并切換到第一個(gè)匹配結(jié)果目錄。

  1. # .bash_profile
  2.  
  3. # 設(shè)置 CDPATH
  4. CDPATH="/var/home/username/favdir1:/var/home/username/favdir2:/var/home/username/favdir3"
  5.  
  6. # 也可以寫成這樣
  7. CDPATH="/:~:/var:~/favdir1:~/favdir2:~/favdir3"
  8.  
  9. export CDPATH

CDPATH 通常像 PATH 一樣的方式進(jìn)行更新 —— 通過在賦值右側(cè)引用自身來保留原來的值。

  1. # .bash_profile
  2.  
  3. # 設(shè)置 CDPATH
  4. CDPATH="/var/home/username/favdir1:/var/home/username/favdir2:/var/home/username/favdir3"
  5.  
  6. # 或者寫成這樣
  7. CDPATH="/:~:/var:~/favdir1:~/favdir2:~/favdir3"
  8.  
  9. CDPATH="$CDPATH:~/favdir4:~/favdir5"
  10.  
  11. export CDPATH

PATH 是另一個(gè)極其重要的變量。它是系統(tǒng)上的命令的搜索路徑。注意,有些應(yīng)用要求將它們自己的目錄加入 PATH 變量,這樣才能正常使用。跟 CDPATH 一樣,通過在賦值右側(cè)引用原值來追加新值到 PATH 變量。如果你希望將新值前置,只需要把原來的值($PATH)放到列表末尾即可。還有注意的是在 Fedora,這一列值通過冒號(hào)分隔(:)。

  1. # .bash_profile
  2.  
  3. # 添加 PATH 值到 PAHT 環(huán)境變量
  4. PATH="$PATH:~/bin:~:/usr/bin:/bin:~/jdk-13.0.2:~/apache-maven-3.6.3"
  5.  
  6. export PATH

命令提示符是另一個(gè)流行的自定義選項(xiàng)。它有七個(gè)可定制的參數(shù):

  • PROMPT_COMMAND:如果設(shè)置了,會(huì)在每一個(gè)主提示符($PS1)出現(xiàn)之前執(zhí)行該值。
  • PROMPT_DIRTRIM:如果設(shè)置成大于零的數(shù),則該值用作展開 \w 和 \W 提示符字符串轉(zhuǎn)義符時(shí)保留的尾隨目錄組件數(shù)量。刪除的字符將替換為省略號(hào)。
  • PS0:這個(gè)參數(shù)的值像 PS1 一樣展開,在交互式 shell 讀取命令之后、執(zhí)行命令之前展示。
  • PS1:主提示符字符串。默認(rèn)值是 \s-\v\$ 
  • PS2:次提示符字符串。默認(rèn)是 。在顯示之前,PS2 像 PS1 那樣展開。
  • PS3:這個(gè)參數(shù)的值用作 select 命令的提示符。如果這個(gè)變量沒有設(shè)置,select 命令會(huì)用 #?  作為提示符。
  • PS4:這個(gè)參數(shù)的值像 PS1 那樣展開,如果設(shè)置了 -x 選項(xiàng),這個(gè)展開值會(huì)在命令行被回顯之前作為提示符顯示。展開后的值的第一個(gè)字符在必要時(shí)會(huì)復(fù)制數(shù)次,指示間接層數(shù)。默認(rèn)值是 

Bash 參考文檔 第五版,Bash 版本 5.0 2019 年 5 月

Bash 的這一個(gè)方面就可以用整篇文章來討論。你可以找到許許多多信息和例子。在本文末尾鏈接的存儲(chǔ)庫(kù)中提供了一些點(diǎn)文件范例,包括提示符重新配置。你可以隨意使用該存儲(chǔ)庫(kù)中的例子進(jìn)行學(xué)習(xí)和體驗(yàn)。

總結(jié)

既然你已經(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è)腳本來判斷一下。

  1. #!/bin/bash
  2.  
  3. case "$-" in
  4. (*i*) echo This shell is interactive ;;
  5. (*) echo This shell is not interactive ;;
  6. esac

把這幾行放到一個(gè)文件里,加上可執(zhí)行權(quán)限,然后運(yùn)行,就能看到你當(dāng)前處于何種類型的 shell。$- 在 Bash 中是一個(gè)變量,如果是交互式 shell,它會(huì)包含字母 i。此外,你可以直接輸出 $- 變量然后檢查它的輸出中是否含有 i 標(biāo)記。

  1. $ echo $-

參考信息

可以參考以下資料以獲取更多信息和示例。Bash 手冊(cè)也是一個(gè)很好的信息來源。請(qǐng)注意,確保你的本地手冊(cè)頁(yè)記錄了你當(dāng)前運(yùn)行的 Bash 版本的特性,因?yàn)樵诰W(wǎng)上找到的信息有時(shí)可能太老(過時(shí)了)或太新(你的系統(tǒng)還沒有安裝)。

對(duì)本文有各種形式(點(diǎn)文件示例、提示,以及腳本文件)貢獻(xiàn)的社區(qū)成員:

  • Micah Abbott – 首席質(zhì)量工程師
  • John Lebon – 首席軟件工程師
  • Dusty Mabe – 首席軟件工程師
  • Colin Walters – 高級(jí)首席軟件工程師

示例點(diǎn)文件和腳本可以在這個(gè)存儲(chǔ)庫(kù)中找到:

請(qǐng)仔細(xì)檢查上面所提供的存儲(chǔ)庫(kù)中的信息。有些可能已經(jīng)過時(shí)了。里面還包含很多開發(fā)中的自定義腳本和寵物容器pet container配置例子,那些不是點(diǎn)文件。我推薦從 John Lebon 的點(diǎn)文件開始學(xué)習(xí),從頭到尾都含有完善的解說,它們是我見過的最詳細(xì)的,并且包含了非常好的描述。祝你學(xué)得開心!

責(zé)任編輯:龐桂玉 來源: Linux中國(guó)
相關(guān)推薦

2010-11-19 16:22:14

Oracle事務(wù)

2010-07-13 09:36:25

2010-06-23 20:31:54

2009-08-25 16:27:10

Mscomm控件

2022-08-26 13:48:40

EPUBLinux

2020-09-21 09:53:04

FlexCSS開發(fā)

2010-11-15 11:40:44

Oracle表空間

2022-06-03 10:09:32

威脅檢測(cè)軟件

2011-07-18 15:08:34

2013-04-16 10:20:21

云存儲(chǔ)服務(wù)云存儲(chǔ)SLA服務(wù)水平協(xié)議

2021-04-28 10:13:58

zookeeperZNode核心原理

2021-01-19 12:00:39

前端監(jiān)控代碼

2010-11-08 13:54:49

Sqlserver運(yùn)行

2018-06-22 13:05:02

前端JavaScript引擎

2010-09-27 09:31:42

JVM內(nèi)存結(jié)構(gòu)

2019-08-02 08:59:21

Token認(rèn)證服務(wù)器

2009-09-24 16:22:50

Hibernate自動(dòng)

2019-11-29 16:21:22

Spring框架集成

2013-10-09 11:07:31

日志文件系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)