Contents

Zsh 與 Bash 腳本。有什麼不同?

當談到類 Unix 作業系統上的 shell 腳本時,有兩種 shell 占主導地位:Bash (Bourne Again Shell) 和 Zsh (Z Shell)。如果您是程式設計師或系統管理員,兩者之間的選擇會極大地影響您的效率和生產力。

理解這兩個 shell 之間的差異和相似之處有助於優化命令列工作流程,因為了解它們的特定特徵可以做出明智的判斷。

什麼是 Bash 和 Zsh?

Bash 是一種多功能且廣泛使用的命令列介面,在 Linux 和 macOS 系統等各種平台上提供廣泛的功能。作為一種強大而高效的工具,它使用戶能夠與作業系統無縫交互,同時執行多個命令。此外,Bash 的功能透過其對 shell 腳本的支援而超出了基本互動的範圍。透過使用包含多個命令的腳本,使用者可以有效地自動執行重複或耗時的任務,從而簡化工作流程。

Zsh 融合了 Mac 和 Linux 作業系統的元素,是一個多功能且功能豐富的命令列介面,可作為 Apple macOS 平台的標準 shell,同時在各種 Linux 發行版中獲得關注。

如何從 Bash 切換到 Zsh

若要從使用 Linux 作業系統無縫過渡到採用 Zsh 作為預設 shell,請先使用發行版各自的套件管理器進行安裝。例如,如果您使用的是 Debian 或基於 Ubuntu 的系統,請執行以下命令:

 sudo apt install zsh 

在電腦上安裝程式後,您可以透過在終端機或命令提示字元中執行特定命令來輕鬆切換到使用它。

 chsh -s $(which zsh) 

若要轉換至 Mac 作業系統上的 Zsh shell,請在終端機中執行下列指令:

 chsh -s /bin/zsh 

要恢復使用 Bash shell 而不是 Zsh,只需修改先前提供的命令,將“Zsh”替換為“Bash”即可。

若要確定目前使用的 shell,請執行下列指令:

 echo $SHELL 

結合使用確認性措施可以幫助驗證使用者正在採用期望的操作環境,從而促進對所做的選擇的更大保證。

Zsh 和 Bash 的區別

檢查 Zsh 和 Bash 之間的差異對於確定哪些 shell 符合您的偏好和要求至關重要。

提示定制

Zsh 提供了一種便捷的方法,透過在主提示符號(表示為 PS1)中利用基於百分比的轉義序列來個性化命令列介面。透過採用這種方法,可以創建具有視覺吸引力和資訊豐富的提示,其中包含顏色和動態產生的內容等元素。為了自訂 shell 提示字元的外觀,您必須先透過定義 PS1 變數來建立所需的配置。

 PS1="%F{green}%n@%m %F{blue}%~ %f$ "

上述自訂提示透過不同顏色的視覺指示器顯示使用者的名字、網域名稱和目前工作目錄:

/bc/images/what-is-the-difference-zsh-vs-bash-scripting-in-the-terminal-prompt-customization.jpg

或者,存在多種用於個人化 Zsh 提示符的方法,可讓人們顯示管理指示、合併當前日期和時間,並保留對更新的提示符號所做的任何修改。

與 Zsh 相比,Bash 採用了另一種策略來實現快速個人化。使用轉義碼可以在提示中自訂顏色和格式。為了達到與 Zsh 範例類似的自訂級別,可以使用後續的自訂提示範本:

 PS1="\[\033[32m\]\u@\h \[\033[34m\]\w \[\033[0m\]\$ "

使用 \\[\033[0m\\] 至關重要,因為它保證對顏色的任何修改都不會影響命令或訊息中的後續文字。

支援關聯數組

Zsh 作為類別 Unix 系統中的原生程式語言,本質上承認關聯數組的概念。關聯數組本質上是鍵值對的集合,可以最輕鬆地組織和檢索資訊。若要建立關聯數組,可以使用「declare」關鍵字後面跟著「-A」來明確聲明其存在。

 # Declare an associative array in Zsh
 declare -A my_assoc_array 

此後可以向關聯數組注入指定的值。

 my_assoc_array=(key1 value1 key2 value2)

要檢索與字典的鍵關聯的值,可以利用索引直接引用和存取這些值。此過程涉及指定感興趣的鍵並將其用作索引,以便在字典中獲取其對應的值。

 echo $my_assoc_array[key1] # Outputs: value1 

Bash 從版本 4 開始提供關聯數組的原生支援。聲明和賦值的過程與 Zsh 中的類似。但是,在檢索陣列元素時,必須將索引括在大括號 {} 內。

 echo "${my_assoc_array[key1]}"

Zsh 和 Bash 之間的一個顯著差異在於它們各自在關聯數組方面的功能。雖然兩種 shell 都提供了此類功能,但 Zsh 為這些資料結構提供了更全面的功能集。具體來說,Zsh 允許關聯數組與不同資料類型的鍵值,而不僅僅是簡單的文字字串;而 Bash 限制其鍵僅由字串元素組成。

在 Bash 程式語言的先前迭代中,使用關聯數組需要實作變通方法或使用外部工具。

擴充的通配符模式

擴展 glob 模式提供了一種強大且通用的方法,用於根據多個標準選擇和操作文件和目錄,這使得它們在涉及複雜目錄結構或文件選擇粒度要求較高的情況下特別有用。

為了利用「setopt」指令啟動 Zsh 腳本中的特定模式比對標準,可以為目前工作目錄指定感興趣的特定檔案副檔名。要實現此目標,只需執行“setopt”命令,後跟所需的檔案副檔名,例如“.txt”,即可識別和處理目前目錄上下文中具有該後綴的文字檔案。

 setopt extended_glob
txt_files=(*.txt)

「.jpg-不是 *.log」。這將選擇具有“.jpg”或“.jpeg”檔案副檔名且不具有相符的“.log”副檔名的所有檔案。

 setopt extended_glob
non_log_files=^(*.log)

為了在 Bash shell 中使用擴展的通配模式,必須透過使用「shopt」命令和「extglob」選項來啟動此功能。舉例來說,如果希望識別並處理當前工作目錄中所有以“.txt”結尾的文件,則可以輸入以下程式碼:

 shopt -s extglob
txt_files=(*.txt)

若要排除具有「.log」檔案副檔名的檔案被匹配,您可以在 grep 命令中使用以下正規表示式模式:css[^.]\*\.log$這將搜尋任何不匹配的字串以句點開頭(即,它不是以“.log”結尾的檔名),後面跟著“\.log”。這會匹配以“.log”結尾的任何字元子字串,其中應包括大多數日誌文件,但排除其他類型的文字檔案或目錄。

 shopt -s extglob
non_log_files=!(*.log) 

就全域模式匹配而言,Zsh 和 Bash 之間存在一個關鍵區別,這與用於啟用這些模式的相應命令有關。然而,應該注意的是,每個 shell 使用的某些操作符可能會有所不同。

進階參數擴展

Zsh 提供間接參數擴充的功能,可對名稱包含在另一個變數中的變數進行求值。為了執行此操作,需要在變數名稱前面加上感嘆號,用“!”表示。

 name="foo"
result="${!name}"
echo "$result"

Bash 本身並不支援間接變數擴展。但是,有一些解決方法可用,例如利用“eval”內建命令或使用“${!variable}”語法來實現變數的間接引用。

 name="world"
var="name"
echo ${!var} # This will output: world

Bash 和 Zsh 之間的相似之處

儘管 Bash 和 Zsh 之間存在差異,但也可以觀察到它們之間的某些共同點。

命令列語法

Bash 和 Zsh 的命令列介面採用類似的結構,這有利於它們之間的無縫互通。因此,大多數指令和腳本序列都可以在兩個 shell 中執行,無需進行調整。 Zsh 構建在 Bash 基礎上這一事實意味著它包含了所有基本功能和功能。

雖然語法結構中可能存在一些需要注意的細微差異,但仔細考慮並相應解決這些差異很重要。

指令替換一致性

命令替換是一種用於執行命令的技術,其中一個命令的結果或輸出被合併為另一個命令中的參數,從而確保不同 shell 環境之間的一致性。

 result=$(ls)

Bash 和 Zsh 都透過允許使用 $(command) 語法來提供類似的功能,該語法可以將命令的輸出替換為變數。此功能促進兩種 shell 類型之間的無縫互通性,同時保持跨不同平台的腳本相容性。

腳本偵錯選項

Bash 和 Zsh 都使用「-x」標誌來促進腳本偵錯。透過使用此標誌執行腳本,它將在執行之前顯示每個命令。這使用戶能夠檢測其腳本中的任何差異。

 # Debugging a script in both Bash and Zsh
#!/bin/bash -x

echo "Debugging Bash script"

在此 Bash 腳本中使用“-x”標誌有助於偵錯操作。透過以 zsh 取代 bash ,也可以在 Zsh 上下文中複製此功能,從而將其優點合併到後一個 shell 環境中。

在 Zsh 和 Bash 之間進行選擇的注意事項

Bash 作為眾多基於Unix 的平台上的預設shell 的流行使其具有更高程度的兼容性和可移植性,使其成為多系統腳本編寫工作的更安全選擇,這些工作需要在不同的硬體架構之間進行最少的修改。

Zsh 提供了一系列複雜的功能,例如關聯陣列、增強的 glob 模式和複雜的參數擴充選項,可簡化進階腳本編寫流程。這些屬性對於那些需要在腳本中進行高級字串處理和結構複雜性的人來說特別有用。

Bash 和 Zsh shell 都擁有蓬勃發展的社區,但後者擁有更強大的社區和廣泛的插件和主題可供選擇。對於那些優先考慮個人化的人來說,這可能代表著 Zsh 的巨大優勢。

Bash 是一種直覺且廣泛使用的 shell,對於不熟悉 shell 腳本編寫的人來說是一個容易上手的入口。其豐富的文件和初學者的材料簡化了掌握該領域基本概念的過程。

使用 Shell 腳本自動執行任務

適當地利用腳本語言透過實作 shell 腳本來簡化流程具有重要價值。透過機械化重複性任務,可以節省大量時間。

除了管理使用者帳戶、監控系統資源、備份資料和執行日常維護之外,這些腳本還可用於最大程度地減少人為監督的可能性。