Skrypty Zsh kontra Bash. Co za różnica?

Jeśli chodzi o skrypty powłoki w systemach operacyjnych typu Unix, dominują dwie powłoki: Bash (Bourne Again Shell) i Zsh (Z Shell). Jeśli jesteś programistą lub administratorem systemu, wybór pomiędzy tymi dwoma znacząco wpływa na Twoją efektywność i produktywność.

Zrozumienie różnic i podobieństw między tymi dwiema powłokami pomoże zoptymalizować przepływ pracy z wiersza poleceń. Znajomość niuansów każdej muszli pomoże Ci podejmować świadome decyzje.

Czym są Bash i Zsh?

Bash jest popularny zarówno w systemach Linux, jak i macOS. Jest to potężne narzędzie, którego można używać do interakcji z systemem operacyjnym i uruchamiania poleceń. Możesz także użyć Bash do wykonywania skryptów powłoki, który automatyzuje zadania, pisząc skrypty zawierające więcej niż jedno polecenie.

Zsh (powłoka Z) to rozszerzona wersja Basha, która ma o wiele więcej funkcji. Jest to domyślna powłoka w systemie macOS. Staje się również coraz bardziej popularny w systemach Linux.

Jak przejść z Bash na Zsh

Jeśli używasz systemu Linux i chcesz przejść na Zsh, zacznij od zainstalowania go za pomocą menedżera pakietów. Na przykład w Debianie lub Ubuntu użyj następującego polecenia:

 sudo apt install zsh 

Po zainstalowaniu go w systemie przełącz się na niego, uruchamiając następującą komendę:

 chsh -s $(which zsh) 

Jeśli używasz systemu macOS, Zsh jest już zainstalowany. Aby się do niego przełączyć, uruchom następujące polecenie:

 chsh -s /bin/zsh 

Aby wrócić do Bash, zamień Zsh na Bash w powyższych poleceniach.

Aby sprawdzić, jakiej powłoki używasz, uruchom następującą komendę:

 echo $SHELL 

Pomoże Ci to potwierdzić, że używasz powłoki, którą zamierzałeś.

Różnice między Zsh i Bash

Istnieje kilka różnic między Zsh i Bash. Uwzględnienie tych różnic pomoże Ci zdecydować, która skorupa będzie Ci najbardziej odpowiadać.

1. Szybka personalizacja

Zsh oferuje łatwiejszy sposób dostosowywania podpowiedzi za pomocą sekwencji ucieczki opartych na %. Pozwala to na dynamiczne monity z kolorem i informacjami. Aby dostosować monit powłoki, zdefiniuj PS1 (podpowiedź podstawowa).

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

Powyższy niestandardowy monit wyświetla nazwę użytkownika, nazwę hosta i bieżący katalog w różnych kolorach:

Istnieje wiele innych sposobów dostosowania monitu Zsh, umożliwiając ustawienie wskaźnika administratora, podanie daty i godziny oraz zapisanie nowego monitu.

Bash stosuje nieco inne podejście, jeśli chodzi o szybkie dostosowywanie. Używa kodów ucieczki do określenia zmian koloru i formatowania w monicie. Aby osiągnąć takie samo dostosowanie jak powyżej Zsh, możesz użyć następującego niestandardowego monitu.

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

Za pomocą \[\033[0m\] ma kluczowe znaczenie, ponieważ gwarantuje, że zmiany kolorów nie wpłyną na tekst następujący po podpowiedzi.

2. Obsługa tablic asocjacyjnych

Zsh natywnie obsługuje tablice asocjacyjne. Tablice te zapewniają wygodny sposób kojarzenia danych, co ułatwia organizowanie i wyszukiwanie informacji. Użyj poleceniadeklaruj -A, aby jawnie zadeklarować tablicę asocjacyjną:

 # Declare an associative array in Zsh 
declare -A my_assoc_array

Następnie możesz przypisać wartości do tablicy asocjacyjnej:

 my_assoc_array=(key1 value1 key2 value2)  

I na koniec uzyskaj dostęp do wartości za pomocą ich kluczy:

 echo $my_assoc_array[key1] # Outputs: value1 

Bash zawiera natywną obsługę tablic asocjacyjnych od wersji 4.0. Deklarujesz i przypisujesz wartości w taki sam sposób, jak w Zsh. Ale jeśli chodzi o dostęp do wartości tablicy, musisz owinąć klucz w nawiasy klamrowe:

 echo "${my_assoc_array[key1]}"  

Główna różnica polega na tym, że obsługa tablic asocjacyjnych w Zsh jest bardziej bogata w funkcje i zaawansowana niż Bash. Zsh pozwala tablicom asocjacyjnym mieć klucze różnych typów danych, a nie tylko ciągi znaków. Bash obsługuje tylko klucze łańcuchowe.

We wcześniejszych wersjach Bash trzeba było znaleźć sposób na obejście tego problemu lub dysponować zewnętrznymi narzędziami do korzystania z tablic asocjacyjnych.

3. Rozszerzone wzorce globowania

Rozszerzone wzorce manipulacji zapewniają potężny i elastyczny sposób wybierania plików i katalogów oraz manipulowania nimi w oparciu o różne kryteria. Są przydatne, gdy pracujesz ze złożonymi strukturami plików lub gdy potrzebujesz precyzyjnej kontroli nad wyborem plików.

W skrypcie Zsh możesz włączyć te wzorce za pomocą polecenia setopt. Na przykład, aby dopasować wszystkie pliki .txt w bieżącym katalogu:

 setopt extended_glob
txt_files=(*.txt)

Aby dopasować wszystkie pliki z wyjątkiem tych z rozszerzeniem .log:

 setopt extended_glob
non_log_files=^(*.log)

W Bash musisz je włączyć za pomocą polecenia shopt z opcją extglob. Na przykład, aby dopasować wszystkie pliki .txt w bieżącym katalogu:

 shopt -s extglob
txt_files=(*.txt)

Aby dopasować wszystkie pliki z wyjątkiem tych z rozszerzeniem .log:

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

Główną różnicą między Zsh i Bash, jeśli chodzi o wzorce globowania, jest polecenie używane do ich włączania. Należy jednak zauważyć, że niektóre operatory różnią się w przypadku obu powłok.

4. Zaawansowane rozszerzanie parametrów

Zsh obsługuje pośrednie rozszerzanie parametrów. Umożliwia to rozszerzenie wartości zmiennej, której nazwa jest przechowywana w innej zmiennej. Aby to osiągnąć należy poprzedzić nazwę zmiennej wykrzyknikiem !.

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

Z drugiej strony Bash nie pozwala natywnie na pośrednią ekspansję. Rozwiązaniem tego problemu jest użycie wbudowanego polecenia eval lub składni ${!var} dla pośrednich odwołań do zmiennych.

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

Podobieństwa między Bashem i Zshem

Chociaż istnieją różnice między Bash i Zsh, mają one również pewne podobieństwa.

1. Składnia wiersza poleceń

Bash i Zsh mają podobną składnię wiersza poleceń. Jest to świetne rozwiązanie, ponieważ oznacza, że ​​większość poleceń i skryptów, które napiszesz, będzie działać w dowolnej powłoce, bez modyfikacji. Zsh jest zbudowany na bazie Bash, więc zawiera te same podstawowe polecenia i funkcje.

Istnieją jednak bardzo niewielkie różnice w składni, które należy zidentyfikować i dostosować.

2. Spójność zastępowania poleceń

Podstawianie poleceń to proces osadzania wyników jednego polecenia w innym. Jest to spójne pomiędzy obydwoma powłokami.

 result=$(ls)  

Zarówno w Bash, jak i Zsh możesz użyć składni $(polecenie), aby zastąpić wynik polecenia zmienną. Pozwala to na łatwe przenoszenie skryptów pomiędzy dwiema powłokami.

3. Opcja debugowania skryptu

Zarówno Bash, jak i Zsh używają flagi -x do debugowania skryptów. Kiedy uruchamiasz skrypt z tą flagą, wyświetla on każde polecenie przed uruchomieniem. Pomaga to zidentyfikować problemy w skryptach.

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

echo "Debugging Bash script"

W tym skrypcie Bash flaga -x umożliwia debugowanie. Możesz zastosować podobne podejście w Zsh; po prostu zamień bash na zsh.

Rozważania dotyczące wyboru między Zsh i Bash

  • Zgodność i przenośność: Bash jest domyślną powłoką w wielu systemach uniksowych. Dzięki temu jest to bezpieczniejszy wybór w przypadku skryptów międzyplatformowych. Jeśli potrzebujesz, aby Twoje skrypty działały na wielu różnych systemach bez modyfikacji, Bash będzie lepszą opcją.
  • Złożoność skryptu i zaawansowane funkcje: Zsh zapewnia zaawansowane funkcje, takie jak tablice asocjacyjne, rozszerzone wzorce globowania i zaawansowane rozszerzanie parametrów. Upraszcza to złożone zadania skryptowe. Jeśli Twoje skrypty wymagają zaawansowanej manipulacji ciągami lub struktur danych, lepszym wyborem będzie Zsh.
  • Społeczność i ekosystem wtyczek: Zarówno Bash, jak i Zsh mają aktywne społeczności, ale Zsh ma silniejszą społeczność i rozległy ekosystem wtyczek i motywów. Jeśli cenisz sobie personalizację, dynamiczna społeczność Zsh i obsługa wtyczek mogą być znaczącą zaletą.
  • Łatwość nauki: Jeśli dopiero zaczynasz przygodę ze skryptami powłoki, bardziej przystępnym punktem wyjścia będzie Bash. Zawiera obszerną dokumentację i zasoby dostępne dla początkujących. Ułatwia to naukę podstaw skryptów powłoki.

Automatyzacja zadań za pomocą skryptów powłoki

Wiedza o tym, jak zautomatyzować zadania za pomocą skryptów powłoki, jest bardzo ważna. Możesz zautomatyzować powtarzalne zadania i zaoszczędzić mnóstwo czasu.

Możesz także używać tych skryptów do zarządzania kontami użytkowników, monitorowania zasobów systemowych, tworzenia kopii zapasowych danych i wykonywania rutynowych prac konserwacyjnych. Starannie napisane mogą również zmniejszyć ryzyko wystąpienia błędu ludzkiego.