Zsh εναντίον σεναρίου Bash. Ποιά είναι η διαφορά?

Όταν πρόκειται για δέσμες ενεργειών φλοιού σε λειτουργικά συστήματα που μοιάζουν με Unix, κυριαρχούν δύο κελύφη: το Bash (Bourne Again Shell) και το Zsh (Z Shell). Εάν είστε προγραμματιστής ή διαχειριστής συστήματος, η επιλογή μεταξύ αυτών των δύο επηρεάζει σημαντικά την αποτελεσματικότητα και την παραγωγικότητά σας.

Η κατανόηση των διαφορών και των ομοιοτήτων μεταξύ αυτών των δύο κελύφους θα σας βοηθήσει να βελτιστοποιήσετε τη ροή εργασίας της γραμμής εντολών. Η γνώση των αποχρώσεων κάθε κελύφους θα σας βοηθήσει να λάβετε τεκμηριωμένες αποφάσεις.

Τι είναι το Bash και το Zsh;

Το Bash είναι δημοφιλές τόσο σε συστήματα Linux όσο και σε συστήματα macOS. Είναι ένα ισχυρό εργαλείο που μπορείτε να χρησιμοποιήσετε για να αλληλεπιδράσετε με το λειτουργικό σύστημα και να εκτελέσετε εντολές. Μπορείτε επίσης να χρησιμοποιήσετε το Bash για δέσμες ενεργειών φλοιού, το οποίο αυτοματοποιεί τις εργασίες γράφοντας σενάρια που περιέχουν περισσότερες από μία εντολές.

Το Zsh (Z shell) είναι μια εκτεταμένη έκδοση του Bash που έχει πολλές περισσότερες δυνατότητες. Είναι το προεπιλεγμένο κέλυφος στο macOS. Γίνεται επίσης όλο και πιο δημοφιλές σε συστήματα Linux.

Πώς να αλλάξετε από Bash σε Zsh

Εάν χρησιμοποιείτε σύστημα Linux και θέλετε να μεταβείτε σε Zsh, ξεκινήστε χρησιμοποιώντας το διαχειριστή πακέτων για να το εγκαταστήσετε. Για παράδειγμα, στο Debian ή στο Ubuntu, χρησιμοποιήστε την ακόλουθη εντολή:

 sudo apt install zsh 

Αφού το εγκαταστήσετε στο σύστημά σας, μεταβείτε σε αυτό εκτελώντας την ακόλουθη εντολή:

 chsh -s $(which zsh) 

Εάν χρησιμοποιείτε macOS, το Zsh είναι ήδη εγκατεστημένο. Για να μεταβείτε σε αυτό, εκτελέστε την ακόλουθη εντολή:

 chsh -s /bin/zsh 

Για να επιστρέψετε στο Bash, αντικαταστήστε το Zsh με το Bash στις παραπάνω εντολές.

Για να ελέγξετε ποιο κέλυφος χρησιμοποιείτε, εκτελέστε την ακόλουθη εντολή:

 echo $SHELL 

Αυτό θα σας βοηθήσει να επιβεβαιώσετε ότι χρησιμοποιείτε το κέλυφος που είχατε σκοπό.

  Διορθώστε το Hulu που δεν λειτουργεί στην τηλεόραση Samsung

Διαφορές μεταξύ Zsh και Bash

Υπάρχουν αρκετές διαφορές μεταξύ Zsh και Bash. Η εξέταση αυτών των διαφορών θα σας βοηθήσει να αποφασίσετε ποιο κέλυφος σας ταιριάζει καλύτερα.

1. Προτροπή προσαρμογής

Το Zsh προσφέρει έναν ευκολότερο τρόπο για την προσαρμογή των μηνυμάτων σας χρησιμοποιώντας ακολουθίες διαφυγής που βασίζονται στο %-. Αυτό επιτρέπει δυναμικές προτροπές με χρώμα και πληροφορίες. Για να προσαρμόσετε την προτροπή του κελύφους σας, ορίστε το PS1 (Κύριο μήνυμα).

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

Η παραπάνω προσαρμοσμένη προτροπή εμφανίζει το όνομα χρήστη, το όνομα κεντρικού υπολογιστή και τον τρέχοντα κατάλογο σε διαφορετικά χρώματα:

Υπάρχουν πολλοί άλλοι τρόποι για να προσαρμόσετε την προτροπή Zsh, επιτρέποντάς σας να ορίσετε μια ένδειξη διαχειριστή, να συμπεριλάβετε την ημερομηνία και την ώρα και να αποθηκεύσετε τη νέα προτροπή.

Το Bash χρησιμοποιεί μια ελαφρώς διαφορετική προσέγγιση όσον αφορά την άμεση προσαρμογή. Χρησιμοποιεί κωδικούς διαφυγής για να καθορίσει τις αλλαγές χρώματος και μορφοποίησης στη γραμμή εντολών. Για να επιτύχετε την ίδια προσαρμογή με το Zsh παραπάνω, μπορείτε να χρησιμοποιήσετε την ακόλουθη προσαρμοσμένη προτροπή.

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

Χρησιμοποιώντας \[\033[0m\] είναι ζωτικής σημασίας, καθώς διασφαλίζει ότι οι αλλαγές χρώματος δεν επηρεάζουν το κείμενο που ακολουθεί την προτροπή.

2. Υποστήριξη για Associative Arrays

Το Zsh υποστηρίζει εγγενώς συσχετιστικούς πίνακες. Αυτοί οι πίνακες παρέχουν έναν βολικό τρόπο συσχέτισης δεδομένων που καθιστά εύκολη την οργάνωση και την ανάκτηση πληροφοριών. Χρησιμοποιήστε την εντολή 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.0. Δηλώνετε και εκχωρείτε τιμές με τον ίδιο τρόπο που θα κάνατε στο Zsh. Αλλά όταν πρόκειται για πρόσβαση σε τιμές πίνακα, πρέπει να τυλίξετε το κλειδί μέσα σε σγουρές αγκύλες:

 echo "${my_assoc_array[key1]}"  

Η κύρια διαφορά είναι ότι η υποστήριξη του Zsh για συσχετιστικούς πίνακες είναι πιο πλούσια σε χαρακτηριστικά και προηγμένη από το Bash. Το Zsh επιτρέπει στους συσχετιστικούς πίνακες να έχουν κλειδιά διαφορετικών τύπων δεδομένων, όχι μόνο συμβολοσειρές. Το Bash υποστηρίζει μόνο πλήκτρα συμβολοσειράς.

  20 εργαλεία ανοιχτού κώδικα μπορούν να βοηθήσουν στην έρευνα για τη θεραπεία του COVID-19

Σε προηγούμενες εκδόσεις του Bash, πρέπει να βρείτε έναν τρόπο αντιμετώπισης ή να έχετε εξωτερικά εργαλεία για να χρησιμοποιήσετε συσχετιστικούς πίνακες.

3. Extended Globbing Patterns

Τα εκτεταμένα σφαιρικά μοτίβα παρέχουν έναν ισχυρό και ευέλικτο τρόπο επιλογής και χειρισμού αρχείων και καταλόγων με βάση διάφορα κριτήρια. Είναι χρήσιμα όταν εργάζεστε με πολύπλοκες δομές αρχείων ή όταν χρειάζεστε ακριβή έλεγχο των επιλογών αρχείων.

Σε ένα σενάριο Zsh, μπορείτε να ενεργοποιήσετε αυτά τα μοτίβα χρησιμοποιώντας την εντολή setopt. Για παράδειγμα, για να αντιστοιχίσετε όλα τα αρχεία .txt στον τρέχοντα κατάλογο:

 setopt extended_glob
txt_files=(*.txt)

Για να αντιστοιχίσετε όλα τα αρχεία εκτός από αυτά με επέκταση .log:

 setopt extended_glob
non_log_files=^(*.log)

Στο Bash, πρέπει να τα ενεργοποιήσετε χρησιμοποιώντας την εντολή shopt με την επιλογή extglob. Για παράδειγμα, για να αντιστοιχίσετε όλα τα αρχεία .txt στον τρέχοντα κατάλογο:

 shopt -s extglob
txt_files=(*.txt)

Για να αντιστοιχίσετε όλα τα αρχεία εκτός από αυτά με επέκταση .log:

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

Η κύρια διαφορά μεταξύ Zsh και Bash όταν πρόκειται για σφαιρικά μοτίβα είναι η εντολή που χρησιμοποιείται για την ενεργοποίησή τους. Ωστόσο, παρατηρήστε ότι ορισμένοι χειριστές είναι διαφορετικοί μεταξύ των δύο κελύφους.

4. Προηγμένη επέκταση παραμέτρων

Το Zsh υποστηρίζει την έμμεση επέκταση των παραμέτρων. Αυτό σας επιτρέπει να επεκτείνετε την τιμή μιας μεταβλητής της οποίας το όνομα είναι αποθηκευμένο σε μια άλλη μεταβλητή. Για να το πετύχετε αυτό, πρέπει να προσθέσετε ένα θαυμαστικό στο όνομα της μεταβλητής !.

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

Το Bash από την άλλη πλευρά δεν επιτρέπει την έμμεση επέκταση εγγενώς. Η λύση για αυτό είναι η χρήση της ενσωματωμένης εντολής eval ή της σύνταξης ${!var} για έμμεσες αναφορές μεταβλητών.

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

Ομοιότητες μεταξύ Bash και Zsh

Αν και υπάρχουν διαφορές μεταξύ του Bash και του Zsh, μοιράζονται επίσης ορισμένες ομοιότητες.

1. Σύνταξη γραμμής εντολών

Το Bash και το Zsh μοιράζονται παρόμοια σύνταξη γραμμής εντολών. Αυτό είναι υπέροχο γιατί σημαίνει ότι οι περισσότερες εντολές και σενάρια που γράφετε θα λειτουργούν σε οποιοδήποτε κέλυφος, χωρίς τροποποίηση. Το Zsh είναι χτισμένο πάνω από το Bash, επομένως περιλαμβάνει όλες τις ίδιες βασικές εντολές και δυνατότητες.

  Δημιουργήστε μαθήματα που βασίζονται σε κοόρτη σε αυτές τις 11 πλατφόρμες

Υπάρχουν, ωστόσο, πολύ μικρές διαφορές στη σύνταξη τις οποίες θα πρέπει να εντοπίσετε και να προσαρμόσετε.

2. Συνέπεια αντικατάστασης εντολών

Η αντικατάσταση εντολών είναι η διαδικασία ενσωμάτωσης της εξόδου μιας εντολής σε μια άλλη. Είναι συνεπής μεταξύ των δύο κελυφών.

 result=$(ls)  

Τόσο στο Bash όσο και στο Zsh, μπορείτε να χρησιμοποιήσετε τη σύνταξη $(command) για να αντικαταστήσετε την έξοδο μιας εντολής σε μια μεταβλητή. Αυτό επιτρέπει την εύκολη φορητότητα των σεναρίων μεταξύ των δύο κελύφους.

3. Επιλογή εντοπισμού σφαλμάτων σεναρίου

Τόσο το Bash όσο και το Zsh χρησιμοποιούν τη σημαία -x για τον εντοπισμό σφαλμάτων σεναρίου. Όταν εκτελείτε ένα σενάριο με αυτήν τη σημαία, εμφανίζει κάθε εντολή πριν εκτελεστεί. Αυτό σας βοηθά να εντοπίσετε προβλήματα στα σενάρια σας.

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

echo "Debugging Bash script"

Σε αυτό το σενάριο Bash, η σημαία -x επιτρέπει τον εντοπισμό σφαλμάτων. Μπορείτε να χρησιμοποιήσετε μια παρόμοια προσέγγιση στο Zsh. απλά αντικαταστήστε το bash με zsh.

Σκέψεις για την επιλογή μεταξύ Zsh και Bash

  • Συμβατότητα και φορητότητα: Το Bash είναι το προεπιλεγμένο κέλυφος σε πολλά συστήματα που βασίζονται σε Unix. Αυτό το καθιστά ασφαλέστερη επιλογή για δέσμες ενεργειών μεταξύ πλατφορμών. Εάν χρειάζεστε τα σενάρια σας να εκτελούνται σε ένα ευρύ φάσμα συστημάτων χωρίς τροποποίηση, το Bash είναι μια καλύτερη επιλογή.
  • Πολυπλοκότητα σεναρίων και προηγμένες δυνατότητες: Το Zsh παρέχει προηγμένες δυνατότητες όπως συσχετιστικούς πίνακες, εκτεταμένα σφαιρικά μοτίβα και προηγμένη επέκταση παραμέτρων. Αυτό απλοποιεί πολύπλοκες εργασίες δέσμης ενεργειών. Εάν τα σενάρια σας απαιτούν προηγμένο χειρισμό συμβολοσειρών ή δομές δεδομένων, το Zsh είναι μια καλύτερη επιλογή.
  • Οικοσύστημα κοινότητας και προσθηκών: Τόσο το Bash όσο και το Zsh έχουν ενεργές κοινότητες, αλλά το Zsh έχει μια ισχυρότερη κοινότητα και ένα εκτεταμένο οικοσύστημα προσθηκών και θεμάτων. Εάν εκτιμάτε την προσαρμογή, η ζωντανή κοινότητα και η υποστήριξη πρόσθετων του Zsh μπορεί να είναι ένα σημαντικό πλεονέκτημα.
  • Ευκολία εκμάθησης: Εάν είστε νέοι στο σενάριο κελύφους, το Bash είναι ένα πιο προσιτό σημείο εκκίνησης. Διαθέτει εκτενή τεκμηρίωση και πόρους διαθέσιμους για αρχάριους. Αυτό διευκολύνει την εκμάθηση των βασικών σεναρίων του κελύφους.

Αυτοματοποίηση εργασιών με χρήση σεναρίων Shell

Είναι πολύ σημαντικό να γνωρίζετε πώς να αυτοματοποιείτε εργασίες χρησιμοποιώντας σενάρια κελύφους. Μπορείτε να αυτοματοποιήσετε επαναλαμβανόμενες εργασίες και να εξοικονομήσετε πολύ χρόνο.

Μπορείτε επίσης να χρησιμοποιήσετε αυτά τα σενάρια για τη διαχείριση λογαριασμών χρηστών, την παρακολούθηση πόρων συστήματος, τη δημιουργία αντιγράφων ασφαλείας δεδομένων και την εκτέλεση τακτικής συντήρησης. Όταν γράφονται προσεκτικά, μπορούν επίσης να μειώσουν την πιθανότητα ανθρώπινου λάθους.