Zsh vs. Bash Scripting. Jaka jest 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 między nimi znacząco wpływa na Twoją wydajność i produktywność.
Zrozumienie rozbieżności i podobieństw między tymi dwiema powłokami może być korzystne w optymalizacji procesu pracy z wierszem poleceń, ponieważ wiedza na temat ich szczególnych cech umożliwia dokonywanie świadomych osądów.
Czym są Bash i Zsh?
Bash, wszechstronny i szeroko wykorzystywany interfejs wiersza poleceń, oferuje szeroki zakres funkcji na różnych platformach, takich jak systemy Linux i macOS. Jako solidne i wydajne narzędzie, umożliwia użytkownikom płynną interakcję z ich systemami operacyjnymi podczas wykonywania wielu poleceń jednocześnie. Dodatkowo, możliwości Bash wykraczają poza podstawowe interakcje dzięki obsłudze skryptów powłoki. Stosując skrypty składające się z wielu poleceń, użytkownicy mogą skutecznie zautomatyzować powtarzalne lub czasochłonne zadania, usprawniając w ten sposób procesy przepływu pracy.
Łączący w sobie elementy systemów operacyjnych Mac i Linux, Zsh jest wszechstronnym i bogatym w funkcje interfejsem wiersza poleceń, który służy jako standardowa powłoka dla platformy macOS firmy Apple, jednocześnie zyskując popularność wśród różnych dystrybucji Linuksa.
Jak przejść z Bash na Zsh
Aby płynnie przejść od korzystania z systemu operacyjnego Linux do przyjęcia Zsh jako domyślnej powłoki, zacznij od wykorzystania odpowiedniego menedżera pakietów dystrybucji do celów instalacji. Na przykład, jeśli pracujesz z systemem opartym na Debianie lub Ubuntu, wykonaj następujące polecenie:
sudo apt install zsh
Po zainstalowaniu programu na komputerze, można łatwo przełączyć się na korzystanie z niego, wykonując określone polecenie w terminalu lub wierszu polecenia.
chsh -s $(which zsh)
Aby przejść do powłoki Zsh w systemie operacyjnym Mac, wykonaj następującą dyrektywę w terminalu:
chsh -s /bin/zsh
Aby powrócić do korzystania z powłoki Bash zamiast Zsh, wystarczy zmodyfikować podane wcześniej polecenia, zastępując “Zsh” słowem “Bash”.
Aby sprawdzić aktualnie używaną powłokę, wykonaj następującą dyrektywę:
echo $SHELL
Zastosowanie środka potwierdzającego może pomóc w sprawdzeniu, czy użytkownik korzysta z pożądanego środowiska operacyjnego, promując w ten sposób większą pewność co do dokonanego wyboru.
Różnice między Zsh i Bash
Zbadanie różnic między Zsh i Bash jest niezbędne do określenia, która z tych powłok jest zgodna z Twoimi preferencjami i wymaganiami.
Personalizacja wiersza poleceń
Zsh zapewnia wygodną metodę personalizacji interfejsu wiersza poleceń poprzez wykorzystanie sekwencji ucieczki opartych na procentach w głównym wierszu polecenia, oznaczonym jako PS1. Stosując to podejście, możliwe jest tworzenie atrakcyjnych wizualnie i informacyjnych podpowiedzi, które zawierają elementy takie jak kolor i dynamicznie generowana zawartość. Aby dostosować wygląd monitu powłoki, należy najpierw ustalić żądaną konfigurację, definiując zmienną PS1.
PS1="%F{green}%n@%m %F{blue}%~ %f$ "
Wyżej wspomniany niestandardowy znak zachęty wyświetla moniker użytkownika, nazwę domeny i bieżący katalog roboczy za pomocą wskaźników wizualnych o różnych odcieniach:
Alternatywnie, istnieje wiele metod personalizacji znaku zachęty Zsh, umożliwiając wyświetlenie wskazania administracyjnego, włączenie bieżącej daty i godziny oraz zachowanie wszelkich modyfikacji wprowadzonych do zaktualizowanego znaku zachęty.
Bash wykorzystuje alternatywną strategię personalizacji zachęty w porównaniu do Zsh. Wykorzystanie kodów escape umożliwia dostosowanie koloru i formatu w zachęcie. Aby osiągnąć podobny poziom dostosowania jak w przykładzie Zsh, można zastosować następujący niestandardowy szablon zachęty:
PS1="\[\033[32m\]\u@\h \[\033[34m\]\w \[\033[0m\]\$ "
Wykorzystanie \\[\033[0m\\]
jest niezbędne, ponieważ gwarantuje, że wszelkie modyfikacje koloru nie wpłyną na dalszy tekst w poleceniu lub wiadomości.
Wsparcie dla tablic asocjacyjnych
Zsh, będąc natywnym językiem programowania w systemach uniksopodobnych, z natury uznaje koncepcję tablic asocjacyjnych. Tablice asocjacyjne są zasadniczo kolekcjami par klucz-wartość, które ułatwiają organizację i wyszukiwanie informacji z najwyższą łatwością. Aby utworzyć tablicę asocjacyjną, można użyć słowa kluczowego “declare”, a następnie “-A”, aby jawnie zadeklarować jej istnienie.
# Declare an associative array in Zsh
declare -A my_assoc_array
Następnie można nadać tablicy asocjacyjnej przypisane wartości.
my_assoc_array=(key1 value1 key2 value2)
Aby pobrać wartości powiązane z kluczami słownika, można użyć indeksowania, aby bezpośrednio odwołać się do tych wartości i uzyskać do nich dostęp. Proces ten polega na określeniu interesującego klucza i użyciu go jako indeksu w celu uzyskania odpowiadającej mu wartości w słowniku.
echo $my_assoc_array[key1] # Outputs: value1
Bash zapewnia natywną obsługę tablic asocjacyjnych począwszy od wersji 4. Proces deklarowania i przypisywania wartości jest podobny do tego w Zsh.Jednak jeśli chodzi o pobieranie elementów tablicy, należy zawrzeć indeks w nawiasach klamrowych {}.
echo "${my_assoc_array[key1]}"
Jedna znacząca różnica między Zsh i Bash polega na ich odpowiednich możliwościach dotyczących tablic asocjacyjnych. Podczas gdy obie powłoki oferują taką funkcjonalność, Zsh zapewnia bardziej wszechstronny zestaw funkcji dla tych struktur danych. W szczególności, Zsh pozwala na tablice asocjacyjne z kluczami o różnych typach danych, wykraczających poza zwykłe ciągi tekstowe; podczas gdy Bash ogranicza swoje klucze wyłącznie do elementów łańcuchowych.
W poprzednich iteracjach języka programowania Bash, wykorzystanie tablic asocjacyjnych wymagało implementacji obejść lub użycia zewnętrznych narzędzi.
Rozszerzone wzorce globowania
Rozszerzone wzorce globowania oferują solidną i wszechstronną metodę wybierania i manipulowania plikami i katalogami według wielu kryteriów, co czyni je szczególnie korzystnymi w sytuacjach obejmujących skomplikowane struktury katalogów lub wymagające poziomy szczegółowości w wyborze plików.
Aby aktywować określone kryteria dopasowywania wzorców w skrypcie Zsh przy użyciu polecenia setopt
, można określić konkretne rozszerzenie pliku będące przedmiotem zainteresowania dla bieżącego katalogu roboczego. Aby osiągnąć ten cel, wystarczy wykonać polecenie setopt
, a następnie żądane rozszerzenie pliku, takie jak .txt
, umożliwiając w ten sposób rozpoznawanie i przetwarzanie plików tekstowych z tym przyrostkiem w kontekście bieżącego katalogu.
setopt extended_glob
txt_files=(*.txt)
" .jpg\ -not *.log". Spowoduje to wybranie wszystkich plików, które mają rozszerzenie “.jpg” lub “.jpeg” i nie mają pasującego rozszerzenia “.log”.
setopt extended_glob
non_log_files=^(*.log)
Aby wykorzystać rozszerzone wzorce globbingowe w powłoce Bash, należy aktywować tę funkcję za pomocą polecenia “shopt” wraz z opcją “extglob”. Aby to zilustrować, jeśli ktoś chce zidentyfikować i przetworzyć wszystkie pliki kończące się na “.txt” znajdujące się w bieżącym katalogu roboczym, wprowadziłby następujący kod:
shopt -s extglob
txt_files=(*.txt)
Aby wykluczyć pliki z rozszerzeniem “.log” z dopasowania, można użyć następującego wzorca wyrażeń regularnych w poleceniu grep:css[^. ]\*\.log$To wyszuka dowolny ciąg, który nie zaczyna się od kropki (tj. nie jest nazwą pliku kończącą się na “.log”), a następnie “\.log”. Dopasowuje to dowolny podciąg znaków, który kończy się na “.log”, co powinno obejmować większość plików dziennika, ale wykluczać inne typy plików tekstowych lub katalogów.
shopt -s extglob
non_log_files=!(*.log)
Jeśli chodzi o dopasowywanie wzorców globalnych, istnieje kluczowa różnica między Zsh i Bash w odniesieniu do odpowiednich poleceń używanych do włączania tych wzorców. Należy jednak zauważyć, że niektóre operatory stosowane przez każdą powłokę mogą się różnić.
Zaawansowane rozszerzanie parametrów
Zsh oferuje możliwość pośredniego rozszerzania parametrów, co umożliwia ocenę zmiennej, której nazwa jest zawarta w innej zmiennej. Aby wykonać tę operację, konieczne jest poprzedzenie nazwy zmiennej wykrzyknikiem, oznaczonym “!”.
name="foo"
result="${!name}"
echo "$result"
Bash z natury nie obsługuje pośrednich interpretacji zmiennych. Dostępne są jednak obejścia, takie jak wykorzystanie wbudowanego polecenia eval lub zastosowanie składni ${!variable}
w celu uzyskania pośredniego odniesienia do zmiennych.
name="world"
var="name"
echo ${!var} # This will output: world
Podobieństwa między Bash i Zsh
Pomimo różnic, które istnieją między Bash i Zsh, można również zaobserwować pewne podobieństwa między nimi.
Składnia wiersza poleceń
Bash i Zsh wykorzystują analogiczną strukturę dla swoich interfejsów wiersza poleceń, co ułatwia płynną interoperacyjność między nimi. W związku z tym większość dyrektyw i sekwencji skryptowych może być wykonywana w obu powłokach bez potrzeby dostosowywania. Fakt, że Zsh jest zbudowany na fundamencie Basha oznacza, że zawiera wszystkie podstawowe możliwości i funkcje.
Chociaż mogą istnieć pewne niewielkie rozbieżności w strukturze gramatycznej, które wymagają uwagi, ważne jest, aby dokładnie je rozważyć i odpowiednio się do nich odnieść.
Spójność podstawiania poleceń
Podstawianie poleceń to technika wykorzystywana podczas wykonywania poleceń, w której wynik lub dane wyjściowe jednego polecenia są włączane jako argument w innym poleceniu, zapewniając jednolitość w różnych środowiskach powłoki.
result=$(ls)
Zarówno Bash, jak i Zsh zapewniają podobną funkcjonalność, umożliwiając wykorzystanie składni $(command), która umożliwia podstawienie wyjścia z polecenia do zmiennej. Ta funkcja ułatwia płynną interoperacyjność między dwoma typami powłok, zachowując kompatybilność skryptów na różnych platformach.
Opcja debugowania skryptów
Zarówno Bash, jak i Zsh używają flagi -x
, aby ułatwić debugowanie skryptów. Wykonanie skryptu przy użyciu tej flagi spowoduje wyświetlenie każdego polecenia przed jego wykonaniem. Umożliwia to użytkownikom wykrycie wszelkich rozbieżności w ich skryptach.
# Debugging a script in both Bash and Zsh
#!/bin/bash -x
echo "Debugging Bash script"
Wykorzystanie flagi -x
w tym skrypcie Bash służy do ułatwienia operacji debugowania. Funkcjonalność ta może być również replikowana w kontekście Zsh poprzez zastąpienie bash
przez zsh
, tym samym włączając jej zalety do tego ostatniego środowiska powłoki.
Rozważania dotyczące wyboru między Zsh i Bash
Powszechność Basha jako domyślnej powłoki na wielu platformach uniksowych nadaje mu podwyższony stopień kompatybilności i przenośności, co czyni go bezpieczniejszym wyborem dla wielosystemowych przedsięwzięć skryptowych, które wymagają minimalnych modyfikacji w różnych architekturach sprzętowych.
Zsh oferuje szereg zaawansowanych możliwości, takich jak tablice asocjacyjne, ulepszone wzorce globalne i skomplikowane opcje rozszerzania parametrów, które upraszczają procesy skryptowe wysokiego poziomu. Atrybuty te są szczególnie korzystne dla tych, którzy wymagają doskonałego przetwarzania ciągów znaków i złożoności strukturalnej w swoich skryptach.
Zarówno powłoka Bash, jak i Zsh mogą pochwalić się prężnie działającymi społecznościami, jednak ta druga posiada bardziej rozbudowaną społeczność i szeroki wachlarz wtyczek i motywów do wyboru. Dla tych, którzy priorytetowo traktują personalizację, może to stanowić istotną korzyść na korzyść Zsh.
Bash, będąc intuicyjną i powszechnie używaną powłoką, służy jako przystępne wejście dla osób niezaznajomionych ze skryptami powłoki. Jego obszerna dokumentacja i materiały dla początkujących upraszczają proces zrozumienia podstawowych pojęć w tej dziedzinie.
Automatyzacja zadań przy użyciu skryptów powłoki
Właściwe wykorzystanie języków skryptowych w celu usprawnienia procesów poprzez implementację skryptów powłoki ma znaczną wartość. Mechanizując powtarzające się zadania, można zaoszczędzić znaczną ilość czasu.
Oprócz zarządzania kontami użytkowników, monitorowania zasobów systemowych, tworzenia kopii zapasowych danych i wykonywania rutynowych czynności konserwacyjnych, skrypty te można wykorzystać do zminimalizowania prawdopodobieństwa ludzkiego nadzoru.