Zsh contro Bash Scripting. Qual è la differenza?

Quando si tratta di scripting di shell su sistemi operativi simili a Unix, dominano due shell: Bash (Bourne Again Shell) e Zsh (Z Shell). Se sei un programmatore o un amministratore di sistema, la scelta tra questi due ha un impatto significativo sulla tua efficienza e produttività.

Comprendere le differenze e le somiglianze tra queste due shell ti aiuterà a ottimizzare il flusso di lavoro della riga di comando. Conoscere le sfumature di ogni guscio ti aiuterà a prendere decisioni informate.

Cosa sono Bash e Zsh?

Bash è popolare sia sui sistemi Linux che su macOS. È uno strumento potente che puoi utilizzare per interagire con il sistema operativo ed eseguire comandi. Puoi anche utilizzare Bash per lo scripting della shell, che automatizza le attività scrivendo script contenenti più di un comando.

Zsh (Z shell) è una versione estesa di Bash che ha molte più funzionalità. È la shell predefinita su macOS. Sta diventando sempre più popolare anche sui sistemi Linux.

Come passare da Bash a Zsh

Se utilizzi un sistema Linux e desideri passare a Zsh, inizia utilizzando il gestore pacchetti per installarlo. Ad esempio, su Debian o Ubuntu, utilizza il seguente comando:

 sudo apt install zsh 

Dopo averlo installato sul tuo sistema, passa ad esso eseguendo il seguente comando:

 chsh -s $(which zsh) 

Se utilizzi macOS, Zsh è già installato. Per passare ad esso eseguire il seguente comando:

 chsh -s /bin/zsh 

Per tornare a Bash, sostituisci Zsh con Bash nei comandi precedenti.

Per verificare quale shell stai utilizzando, esegui il seguente comando:

 echo $SHELL 

Questo ti aiuterà a confermare che stai utilizzando la shell che intendevi.

Differenze tra Zsh e Bash

Esistono molte differenze tra Zsh e Bash. Considerare queste differenze ti aiuterà a decidere quale shell si adatta meglio a te.

1. Personalizzazione rapida

Zsh offre un modo più semplice per personalizzare i tuoi prompt utilizzando sequenze di escape basate su %. Ciò consente prompt dinamici con colori e informazioni. Per personalizzare il prompt della shell, definire PS1 (prompt primario).

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

Il prompt personalizzato sopra mostra il nome utente, il nome host e la directory corrente in diversi colori:

Esistono molti altri modi per personalizzare il prompt Zsh, consentendoti di impostare un indicatore di amministrazione, includere la data e l’ora e salvare il nuovo prompt.

Bash utilizza un approccio leggermente diverso quando si tratta di personalizzazione rapida. Utilizza codici di escape per specificare le modifiche al colore e alla formattazione nel prompt. Per ottenere la stessa personalizzazione di Zsh sopra, puoi utilizzare il seguente prompt personalizzato.

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

Usando \[\033[0m\] è fondamentale in quanto garantisce che i cambiamenti di colore non influenzino il testo che segue il prompt.

2. Supporto per array associativi

Zsh supporta nativamente gli array associativi. Questi array forniscono un modo conveniente per associare i dati che semplifica l’organizzazione e il recupero delle informazioni. Utilizzare il comando di dichiarazione -A per dichiarare esplicitamente un array associativo:

 # Declare an associative array in Zsh 
declare -A my_assoc_array

È quindi possibile assegnare valori all’array associativo:

 my_assoc_array=(key1 value1 key2 value2)  

E, infine, accedi ai valori utilizzando le relative chiavi:

 echo $my_assoc_array[key1] # Outputs: value1 

Bash ha incluso il supporto nativo per gli array associativi dalla versione 4.0. Dichiari e assegni valori nello stesso modo in cui faresti in Zsh. Ma quando si tratta di accedere ai valori dell’array, è necessario racchiudere la chiave tra parentesi graffe:

 echo "${my_assoc_array[key1]}"  

La differenza principale è che il supporto di Zsh per gli array associativi è più ricco di funzionalità e avanzato rispetto a Bash. Zsh consente agli array associativi di avere chiavi di vari tipi di dati, non solo stringhe. Bash supporta solo chiavi stringa.

Nelle versioni precedenti di Bash, era necessario trovare soluzioni alternative o disporre di strumenti esterni per utilizzare gli array associativi.

3. Modelli di globbing estesi

I modelli di globbing estesi forniscono un modo potente e flessibile per selezionare e manipolare file e directory in base a vari criteri. Sono utili quando lavori con strutture di file complesse o quando hai bisogno di un controllo preciso sulle selezioni dei file.

In uno script Zsh, puoi abilitare questi modelli usando il comando setopt. Ad esempio, per abbinare tutti i file .txt nella directory corrente:

 setopt extended_glob
txt_files=(*.txt)

Per abbinare tutti i file tranne quelli con estensione .log:

 setopt extended_glob
non_log_files=^(*.log)

In Bash, devi abilitarli usando il comando shopt con l’opzione extglob. Ad esempio, per abbinare tutti i file .txt nella directory corrente:

 shopt -s extglob
txt_files=(*.txt)

Per abbinare tutti i file tranne quelli con estensione .log:

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

La differenza principale tra Zsh e Bash quando si tratta di pattern globbing è il comando utilizzato per abilitarli. Tuttavia, nota che alcuni operatori sono diversi tra le due shell.

4. Espansione avanzata dei parametri

Zsh supporta l’espansione indiretta dei parametri. Ciò consente di espandere il valore di una variabile il cui nome è memorizzato in un’altra variabile. Per ottenere ciò, è necessario anteporre al nome della variabile un punto esclamativo!.

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

Bash d’altra parte non consente l’espansione indiretta in modo nativo. La soluzione alternativa a questo problema è utilizzare il comando integrato eval o la sintassi ${!var} per i riferimenti alle variabili indirette.

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

Somiglianze tra Bash e Zsh

Sebbene esistano differenze tra Bash e Zsh, condividono anche alcune somiglianze.

1. Sintassi della riga di comando

Bash e Zsh condividono una sintassi della riga di comando simile. Questo è fantastico perché significa che la maggior parte dei comandi e degli script che scrivi funzioneranno in entrambe le shell, senza modifiche. Zsh è basato su Bash, quindi include tutti gli stessi comandi e funzionalità di base.

Esistono, tuttavia, differenze minime nella sintassi che dovrai identificare e modificare.

2. Coerenza della sostituzione dei comandi

La sostituzione dei comandi è il processo di incorporamento dell’output di un comando in un altro. È coerente tra entrambi i gusci.

 result=$(ls)  

Sia in Bash che in Zsh, puoi utilizzare la sintassi $(comando) per sostituire l’output di un comando in una variabile. Ciò consente una facile portabilità degli script tra le due shell.

3. Opzione di debug dello script

Sia Bash che Zsh utilizzano il flag -x per il debug degli script. Quando esegui uno script con questo flag, viene visualizzato ogni comando prima dell’esecuzione. Questo ti aiuta a identificare i problemi nei tuoi script.

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

echo "Debugging Bash script"

In questo script Bash, il flag -x abilita il debug. Puoi utilizzare un approccio simile in Zsh; basta sostituire bash con zsh.

Considerazioni sulla scelta tra Zsh e Bash

  • Compatibilità e portabilità: Bash è la shell predefinita su molti sistemi basati su Unix. Ciò lo rende una scelta più sicura per lo scripting multipiattaforma. Se hai bisogno che i tuoi script vengano eseguiti su un’ampia gamma di sistemi senza modifiche, Bash è un’opzione migliore.
  • Complessità degli script e funzionalità avanzate: Zsh fornisce funzionalità avanzate come array associativi, modelli di globbing estesi ed espansione avanzata dei parametri. Ciò semplifica le attività di scripting complesse. Se i tuoi script richiedono una manipolazione avanzata di stringhe o strutture dati, Zsh è la scelta migliore.
  • Comunità ed ecosistema di plugin: sia Bash che Zsh hanno comunità attive, ma Zsh ha una comunità più forte e un vasto ecosistema di plugin e temi. Se apprezzi la personalizzazione, la vivace community di Zsh e il supporto dei plug-in possono rappresentare un vantaggio significativo.
  • Facilità di apprendimento: se sei nuovo allo scripting di shell, Bash è un punto di partenza più accessibile. Ha un’ampia documentazione e risorse disponibili per i principianti. Ciò rende più semplice apprendere le basi dello scripting di shell.

Automatizzazione delle attività utilizzando gli script di shell

Sapere come automatizzare le attività utilizzando gli script di shell è di grande importanza. Puoi automatizzare le attività ripetitive e risparmiare molto tempo.

È inoltre possibile utilizzare questi script per gestire gli account utente, monitorare le risorse di sistema, eseguire il backup dei dati ed eseguire la manutenzione ordinaria. Se scritti con cura, possono anche ridurre il rischio di errore umano.