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 -xecho "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.