如何解析 Bash 程序的配置文件
將配置文件與代碼分離,使任何人都可以改變他們的配置,而不需要任何特殊的編程技巧。
將程序配置與代碼分離是很重要的。它使非程序員能夠改變配置而不需要修改程序的代碼。如果是編譯好的二進(jìn)制可執(zhí)行文件,這對(duì)非程序員來(lái)說(shuō)是不可能的,因?yàn)樗粌H需要訪(fǎng)問(wèn)源文件(我們?cè)陂_(kāi)源程序中會(huì)這樣),而且還需要程序員的技能組合。很少有人有這種能力,而且大多數(shù)人都不想學(xué)習(xí)它。
對(duì)于像 Bash 這樣的 shell 語(yǔ)言,由于 shell 腳本沒(méi)有被編譯成二進(jìn)制格式,所以從定義上講,源碼是可以訪(fǎng)問(wèn)的。盡管有這種開(kāi)放性,但對(duì)于非程序員來(lái)說(shuō),在 shell 腳本中鉆研和修改它們并不是一個(gè)特別好的主意。即使是經(jīng)驗(yàn)豐富的開(kāi)發(fā)人員和系統(tǒng)管理員,也會(huì)意外地做出一些導(dǎo)致錯(cuò)誤或更糟的改變。
因此,將配置項(xiàng)放在容易維護(hù)的文本文件中,提供了分離,并允許非程序員編輯配置,而不會(huì)有對(duì)代碼進(jìn)行意外修改的危險(xiǎn)。許多開(kāi)發(fā)者對(duì)用編譯語(yǔ)言編寫(xiě)的程序都是這樣做的,因?yàn)樗麄儾⒉黄谕脩?hù)是開(kāi)發(fā)者。由于許多相同的原因,對(duì)解釋型 shell 語(yǔ)言這樣做也是有意義的。
通常的方式
和其他許多語(yǔ)言一樣, 你可以為 Bash 程序編寫(xiě)代碼,來(lái)讀取并解析 ASCII 文本的配置文件、讀取變量名稱(chēng)并在程序代碼執(zhí)行時(shí)設(shè)置值。例如,一個(gè)配置文件可能看起來(lái)像這樣:
var1=LinuxGeek46var2=Opensource.com
程序?qū)⒆x取文件,解析每一行,并將值設(shè)置到每個(gè)變量中。
源引
Bash 使用一種更簡(jiǎn)單的方法來(lái)解析和設(shè)置變量, 叫做源引。從一個(gè)可執(zhí)行的 shell 程序中獲取一個(gè)外部文件是一種簡(jiǎn)單的方法,可以將該文件的內(nèi)容完整地引入 shell 程序中。在某種意義上,這很像編譯語(yǔ)言的 include 語(yǔ)句,在運(yùn)行時(shí)包括庫(kù)文件。這樣的文件可以包括任何類(lèi)型的 Bash 代碼,包括變量賦值。
(LCTT 譯注:對(duì)于使用 source 或 . 命令引入另外一個(gè)文件的行為,我們首倡翻譯為“源引”。)
像往常一樣,演示比解釋更容易。
首先,創(chuàng)建一個(gè) ~/bin 目錄(如果它還不存在的話(huà)),并將其作為當(dāng)前工作目錄(PWD)。Linux 文件系統(tǒng)分層標(biāo)準(zhǔn) 將 ~/bin 定義為用戶(hù)存儲(chǔ)可執(zhí)行文件的適當(dāng)位置。
在這個(gè)目錄下創(chuàng)建一個(gè)新文件。將其命名為 main,并使其可執(zhí)行:
[dboth@david bin]$ touch main[dboth@david bin]$ chmod +x main[dboth@david bin]$
在這個(gè)可執(zhí)行文件中添加以下內(nèi)容:
#!/bin/bashName="LinuxGeek"echo $Name
并執(zhí)行這個(gè) Bash 程序:
[dboth@david bin]$ ./mainLinuxGeek[dboth@david bin]$
創(chuàng)建一個(gè)新的文件并命名為 ~/bin/data。這個(gè)文件不需要是可執(zhí)行的。在其中添加以下信息:
# Sourced code and variablesecho "This is the sourced code from the data file."FirstName="David"LastName="Both"
在 main 程序中增加三行,看起來(lái)像這樣:
#!/bin/bashName="LinuxGeek"echo $Namesource ~/bin/dataecho "First name: $FirstName"echo "LastName: $LastName"
重新運(yùn)行該程序:
[dboth@david bin]$ ./mainLinuxGeekThis is the sourced code from the data file.First name: DavidLastName: Both[dboth@david bin]$
關(guān)于源引還有一件非??岬氖虑橐?。你可以使用一個(gè)單點(diǎn)(.)作為 source 命令的快捷方式。改變 main 文件,用 . 代替 source。
#!/bin/bashName="LinuxGeek"echo $Name. ~/bin/dataecho "First name: $FirstName"echo "LastName: $LastName"
并再次運(yùn)行該程序。其結(jié)果應(yīng)該與之前的運(yùn)行完全相同。
運(yùn)行 Bash
每一臺(tái)使用 Bash 的 Linux 主機(jī)(幾乎所有主機(jī)都是,因?yàn)?Bash 是所有發(fā)行版的默認(rèn) shell),都包括一些優(yōu)秀的、內(nèi)置的源引示例。
每當(dāng) Bash shell 運(yùn)行時(shí),它的環(huán)境必須被配置成可以使用的樣子。有五個(gè)主要文件和一個(gè)目錄用于配置 Bash 環(huán)境。它們和它們的主要功能如下:
/etc/profile: 系統(tǒng)級(jí)的環(huán)境和啟動(dòng)程序/etc/bashrc: 系統(tǒng)級(jí)的函數(shù)和別名/etc/profile.d/: 包含系統(tǒng)級(jí)的腳本的目錄,用于配置各種命令行工具,如vim和mc以及系統(tǒng)管理員創(chuàng)建的任何自定義配置腳本~/.bash_profile: 用戶(hù)特定的環(huán)境和啟動(dòng)程序~/.bashrc: 用戶(hù)特定的別名和函數(shù)~/.bash_logout: 用戶(hù)特定的命令,在用戶(hù)注銷(xiāo)時(shí)執(zhí)行
試著通過(guò)這些文件追蹤執(zhí)行順序,確定它在非登錄 Bash 初始化和登錄 Bash 初始化中使用的順序。我在我的 Linux 培訓(xùn)系列《使用和管理 Linux:從零到系統(tǒng)管理員》的第一卷第 17 章中這樣做過(guò)。
給你一個(gè)提示。這一切都從 ~/.bashrc 腳本開(kāi)始。
總結(jié)
這篇文章探討了在 Bash 程序中引用代碼和變量的方法。這種從配置文件中解析變量的方法是快速、簡(jiǎn)單和靈活的。它提供了一種將 Bash 代碼與變量賦值分開(kāi)的方法,以使非程序員能夠設(shè)置這些變量的值。















 
 
 


 
 
 
 