Skriptování Zsh vs. Bash. Jaký je v tom rozdíl?

Photo of author

By etechblogcz

V oblasti skriptování pro operační systémy typu Unix se setkáváme s dvěma dominantními shelly: Bash (Bourne Again Shell) a Zsh (Z Shell). Pro programátory i administrátory systémů je volba mezi těmito dvěma zásadní, jelikož výrazně ovlivňuje efektivitu a produktivitu práce.

Pochopení rozdílů a podobností těchto shellů vám umožní optimalizovat práci v příkazovém řádku. Znalost nuancí každého z nich vám poskytne pevný základ pro informovaná rozhodnutí.

Co jsou Bash a Zsh?

Bash, hojně využívaný na systémech Linux i macOS, je mocný nástroj pro interakci s operačním systémem a spouštění příkazů. Skriptování v Bash automatizuje úlohy vytvářením skriptů obsahujících více příkazů.

Zsh (Z shell), vylepšená verze Bash, nabízí širší škálu funkcí. Je to výchozí shell v macOS a získává na popularitě i v systémech Linux.

Jak přejít z Bash na Zsh

Pokud používáte Linux a chcete přejít na Zsh, instalace pomocí správce balíčků je prvním krokem. Například v Debianu nebo Ubuntu použijte příkaz:

 sudo apt install zsh 

Po instalaci aktivujte Zsh jako výchozí shell pomocí příkazu:

 chsh -s $(which zsh) 

Uživatelé macOS již mají Zsh nainstalovaný. Přepnutí provedete příkazem:

 chsh -s /bin/zsh 

Pro návrat k Bash jednoduše nahraďte Zsh v uvedených příkazech názvem Bash.

Chcete-li zjistit, který shell aktuálně používáte, použijte příkaz:

 echo $SHELL 

Tímto způsobem se ujistíte, že pracujete s požadovaným shellem.

Rozdíly mezi Zsh a Bash

Mezi Zsh a Bash existuje několik klíčových rozdílů, jejichž zvážení pomůže vybrat ten správný shell pro vaše potřeby.

1. Přizpůsobení výzvy

Zsh usnadňuje přizpůsobení výzvy pomocí escape sekvencí s %. To umožňuje dynamické výzvy s barvami a informacemi. K přizpůsobení výzvy se používá proměnná PS1 (Primary Prompt).

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

Tato vlastní výzva zobrazuje uživatelské jméno, název hostitele a aktuální adresář různými barvami.

Možností úprav výzvy v Zsh je mnoho, včetně nastavení indikátoru správce, zahrnutí data a času, a uložení nové výzvy.

Bash používá odlišný přístup k přizpůsobení výzvy, kde se pro změnu barev a formátování používají escape kódy. Chcete-li dosáhnout stejného přizpůsobení jako v Zsh, použijte následující vlastní výzvu:

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

Použití \[\033[0m\] je klíčové pro zajištění, aby změny barev neovlivnily text následující za výzvou.

2. Podpora asociativních polí

Zsh nativně podporuje asociativní pole, což je efektivní způsob pro organizaci a získávání dat. Pro explicitní deklaraci asociativního pole se používá příkaz declare -A:

 # Deklarace asociativního pole v Zsh 
declare -A my_assoc_array

Následuje přiřazení hodnot:

 my_assoc_array=(key1 value1 key2 value2)  

A přístup k hodnotám pomocí klíčů:

 echo $my_assoc_array[key1] # Výstup: value1 

Bash nabízí nativní podporu asociativních polí od verze 4.0. Hodnoty se deklarují a přiřazují stejným způsobem jako v Zsh, ale při přístupu k hodnotám je nutné klíč uzavřít do složených závorek:

 echo "${my_assoc_array[key1]}"  

Podpora asociativních polí v Zsh je bohatší a pokročilejší než v Bash. Zsh umožňuje asociativním polím mít klíče různých datových typů, zatímco Bash podporuje pouze řetězcové klíče.

Ve starších verzích Bash bylo nutné použít alternativní postupy nebo externí nástroje pro práci s asociativními poli.

3. Rozšířené globovací vzory

Rozšířené globovací vzory umožňují flexibilní výběr a manipulaci se soubory a adresáři podle různých kritérií. Jsou užitečné při práci se složitými souborovými strukturami nebo když potřebujete přesnou kontrolu nad výběrem souborů.

V Zsh se tyto vzory aktivují příkazem setopt. Například pro výběr všech souborů .txt v aktuálním adresáři:

 setopt extended_glob
txt_files=(*.txt)

Pro výběr všech souborů kromě .log:

 setopt extended_glob
non_log_files=^(*.log)

V Bash se používá příkaz shopt s možností extglob. Například pro výběr souborů .txt:

 shopt -s extglob
txt_files=(*.txt)

A pro výběr všech souborů kromě .log:

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

Hlavním rozdílem mezi Zsh a Bash je příkaz používaný k aktivaci těchto vzorů, a některé operátory se mezi shelly liší.

4. Rozšířené rozšíření parametrů

Zsh podporuje nepřímé rozšíření parametrů, které umožňuje rozšíření hodnoty proměnné, jejíž název je uložen v jiné proměnné. Provedete to přidáním vykřičníku ! před název proměnné.

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

Bash nativně nepřímou expanzi nepodporuje. Řešením je použití vestavěného příkazu eval nebo syntaxe ${!var} pro nepřímé odkazy na proměnné.

 name="world"
var="name"
echo ${!var} # Výstup: world

Podobnosti mezi Bash a Zsh

Přestože existují rozdíly, Bash a Zsh sdílí také řadu podobností.

1. Syntaxe příkazového řádku

Bash a Zsh mají podobnou syntaxi příkazového řádku, což znamená, že většina příkazů a skriptů bude fungovat v obou shellech bez úprav. Zsh je založen na Bash, a proto zahrnuje všechny jeho základní příkazy a funkce.

Existují však drobné rozdíly v syntaxi, které je nutné identifikovat a upravit.

2. Konzistence substituce příkazů

Substituce příkazů, proces vkládání výstupu jednoho příkazu do druhého, je konzistentní v obou shellech.

 result=$(ls)  

V Bash i Zsh lze použít syntaxi $(command) pro substituci výstupu příkazu do proměnné, což umožňuje snadnou přenositelnost skriptů mezi oběma shelly.

3. Možnost ladění skriptů

Oba shelly, Bash i Zsh, používají příznak -x pro ladění skriptů. Při spuštění skriptu s tímto příznakem se před spuštěním zobrazí každý příkaz, což usnadňuje identifikaci problémů ve skriptech.

 # Ladění skriptu v Bash i Zsh
#!/bin/bash -x

echo "Ladění Bash skriptu"

V tomto skriptu Bash se pro ladění používá parametr -x. Podobný přístup lze použít i v Zsh, stačí nahradit bash za zsh.

Úvahy o výběru mezi Zsh a Bash

  • Kompatibilita a přenositelnost: Bash je výchozím shellem v mnoha systémech založených na Unixu, což z něj činí bezpečnější volbu pro multiplatformní skriptování. Pokud je nutné, aby vaše skripty fungovaly na široké škále systémů bez úprav, Bash je lepší volba.
  • Složitost skriptů a pokročilé funkce: Zsh nabízí pokročilé funkce, jako jsou asociativní pole, rozšířené globovací vzory a pokročilé rozšíření parametrů, což usnadňuje komplexní skriptovací úlohy. Pokud vaše skripty vyžadují pokročilou manipulaci s řetězci nebo datovými strukturami, Zsh je lepší volbou.
  • Komunita a ekosystém pluginů: Obě komunity, Bash i Zsh, jsou aktivní, ale Zsh má silnější komunitu a rozsáhlý ekosystém pluginů a témat. Pokud si ceníte přizpůsobení, živá komunita a podpora pluginů Zsh mohou být významnou výhodou.
  • Snadnost učení: Pro začátečníky ve skriptování je Bash přístupnějším výchozím bodem. Má rozsáhlou dokumentaci a zdroje dostupné pro začátečníky, což usnadňuje naučení základů skriptování.

Automatizace úloh pomocí skriptů Shell

Znalost automatizace úloh pomocí shell skriptů je velmi důležitá, protože umožňuje automatizovat opakující se úlohy a ušetřit tak značné množství času.

Tyto skripty lze také použít ke správě uživatelských účtů, monitorování systémových prostředků, zálohování dat a provádění běžné údržby. Pečlivě napsané skripty také snižují potenciál lidské chyby.