Lorsqu’il s’agit de scripts shell sur les systèmes d’exploitation de type Unix, deux interpréteurs de commandes se distinguent : Bash (Bourne Again Shell) et Zsh (Z Shell). En tant que développeur ou administrateur système, votre choix entre ces deux options a une incidence notable sur votre efficacité et votre productivité.
La compréhension des divergences et des similitudes entre ces deux shells est primordiale pour optimiser votre workflow en ligne de commande. La connaissance des particularités de chaque interpréteur de commandes vous permet de faire des choix éclairés.
Qu’est-ce que Bash et Zsh ?
Bash est très répandu sur les systèmes Linux et macOS. Il s’agit d’un outil puissant qui permet d’interagir avec le système d’exploitation et d’exécuter des commandes. Bash sert également à la création de scripts shell qui automatisent des actions par l’écriture de programmes regroupant plusieurs commandes.
Zsh, quant à lui, est une version améliorée de Bash dotée de nombreuses fonctionnalités supplémentaires. Il s’agit de l’interpréteur de commandes par défaut sur macOS. Sa popularité ne cesse de croître également sur les systèmes Linux.
Comment passer de Bash à Zsh
Si vous utilisez un système Linux et que vous souhaitez migrer vers Zsh, commencez par l’installer via votre gestionnaire de paquets. Par exemple, sous Debian ou Ubuntu, utilisez la commande suivante :
sudo apt install zsh
Après l’installation, vous pouvez accéder à Zsh en utilisant la commande ci-dessous :
chsh -s $(which zsh)
Si vous utilisez macOS, Zsh est déjà présent. Pour l’utiliser, entrez la commande suivante :
chsh -s /bin/zsh
Pour rétablir Bash, remplacez simplement Zsh par Bash dans les commandes ci-dessus.
Afin de vérifier quel shell est en cours d’utilisation, employez la commande suivante :
echo $SHELL
Ceci vous permettra de confirmer que vous utilisez bien l’interpréteur de commandes souhaité.
Différences entre Zsh et Bash
De nombreuses distinctions existent entre Zsh et Bash. La prise en compte de ces différences vous aidera à déterminer quel interpréteur de commandes correspond le mieux à vos besoins.
1. Personnalisation de l’invite
Zsh offre une méthode plus intuitive pour personnaliser vos invites en utilisant des séquences d’échappement basées sur le caractère %. Cela permet des invites dynamiques intégrant des couleurs et des informations. Pour personnaliser votre invite de shell, configurez la variable PS1 (Primary Prompt).
PS1="%F{green}%n@%m %F{blue}%~ %f$ "
L’invite personnalisée ci-dessus affichera le nom d’utilisateur, le nom d’hôte et le répertoire courant en utilisant différentes couleurs :
Il existe une myriade de possibilités pour personnaliser l’invite Zsh, vous permettant de définir un indicateur d’administration, d’inclure la date et l’heure et de sauvegarder la nouvelle invite.
Bash utilise une approche légèrement différente pour la personnalisation des invites. Il utilise des codes d’échappement pour spécifier les modifications de couleur et de mise en forme dans l’invite. Pour obtenir la même personnalisation que sous Zsh, vous pouvez utiliser l’invite personnalisée ci-dessous :
PS1="\[\033[32m\]\u@\h \[\033[34m\]\w \[\033[0m\]\$ "
L’utilisation de \[\033[0m\] est fondamentale car cela assure que les modifications de couleur n’affecteront pas le texte qui suit l’invite.
2. Gestion des tableaux associatifs
Zsh prend en charge nativement les tableaux associatifs. Ces tableaux constituent un moyen efficace d’associer des données, ce qui facilite l’organisation et la récupération d’informations. Utilisez la commande declare -A pour déclarer explicitement un tableau associatif :
# Déclaration d'un tableau associatif dans Zsh
declare -A my_assoc_array
Vous pouvez ensuite assigner des valeurs au tableau associatif :
my_assoc_array=(key1 value1 key2 value2)
Et enfin, vous pouvez accéder aux valeurs à l’aide de leurs clés :
echo $my_assoc_array[key1] # Affiche: value1
Bash inclut la gestion native des tableaux associatifs depuis la version 4.0. La déclaration et l’attribution des valeurs se font de manière identique à Zsh. Cependant, lors de l’accès aux valeurs du tableau, vous devez encadrer la clé entre accolades :
echo "${my_assoc_array[key1]}"
La principale différence réside dans le fait que la gestion des tableaux associatifs par Zsh est plus riche et plus évoluée que celle de Bash. Zsh autorise les tableaux associatifs à avoir des clés de différents types de données, et pas seulement des chaînes de caractères. Bash ne prend en charge que les clés de type chaîne de caractères.
Dans les anciennes versions de Bash, vous deviez trouver une solution de contournement ou utiliser des outils externes pour utiliser les tableaux associatifs.
3. Modèles de globbing étendus
Les modèles de globbing étendus offrent une méthode puissante et flexible pour sélectionner et manipuler des fichiers et des répertoires en fonction de critères variés. Ils s’avèrent utiles lorsque vous manipulez des structures de fichiers complexes ou lorsque vous avez besoin d’un contrôle précis sur les sélections de fichiers.
Dans un script Zsh, vous pouvez activer ces modèles en utilisant la commande setopt. Par exemple, pour cibler tous les fichiers .txt dans le répertoire actuel :
setopt extended_glob
txt_files=(*.txt)
Pour sélectionner tous les fichiers à l’exception de ceux avec l’extension .log :
setopt extended_glob
non_log_files=^(*.log)
Dans Bash, vous devez les activer en utilisant la commande shopt avec l’option extglob. Par exemple, pour cibler tous les fichiers .txt dans le répertoire courant :
shopt -s extglob
txt_files=(*.txt)
Pour sélectionner tous les fichiers à l’exception de ceux avec l’extension .log :
shopt -s extglob
non_log_files=!(*.log)
La principale différence entre Zsh et Bash en ce qui concerne les modèles de globbing réside dans la commande utilisée pour les activer. Il est à noter que certains opérateurs sont différents entre les deux interpréteurs de commandes.
4. Expansion avancée des paramètres
Zsh supporte l’expansion indirecte des paramètres. Cela vous permet d’étendre la valeur d’une variable dont le nom est stocké dans une autre variable. Pour ce faire, vous devez préfixer le nom de la variable par un point d’exclamation !.
name="foo"
result="${!name}"
echo "$result"
Bash, en revanche, ne permet pas nativement l’expansion indirecte. La solution consiste à employer la commande intégrée eval ou la syntaxe ${!var} pour les références de variables indirectes.
name="world"
var="name"
echo ${!var} # Cela affichera : world
Similitudes entre Bash et Zsh
Bien qu’il existe des distinctions entre Bash et Zsh, ils partagent aussi des points communs.
1. Syntaxe de ligne de commande
Bash et Zsh partagent une syntaxe de ligne de commande similaire. C’est avantageux car cela signifie que la plupart des commandes et des scripts que vous écrivez fonctionneront dans l’un ou l’autre shell, sans modification. Zsh est construit sur Bash, il inclut donc toutes les mêmes commandes et fonctionnalités de base.
Cependant, il existe des différences de syntaxe très mineures que vous devrez identifier et ajuster.
2. Cohérence des substitutions de commandes
La substitution de commande est le processus d’intégration du résultat d’une commande dans une autre. Ce processus est cohérent entre les deux shells.
result=$(ls)
Dans Bash et Zsh, vous pouvez utiliser la syntaxe $(commande) pour remplacer la sortie d’une commande par une variable. Cela facilite la portabilité des scripts entre les deux shells.
3. Option de débogage de script
Bash et Zsh utilisent tous deux l’indicateur -x pour le débogage des scripts. Lorsque vous exécutez un script avec cet indicateur, il affichera chaque commande avant son exécution. Cela vous aide à identifier les problèmes dans vos scripts.
# Débogage d'un script sous Bash et Zsh
#!/bin/bash -xecho "Débogage du script Bash"
Dans ce script Bash, l’indicateur -x active le débogage. Vous pouvez utiliser une approche similaire dans Zsh ; remplacez simplement bash par zsh.
Considérations pour choisir entre Zsh et Bash
- Compatibilité et portabilité : Bash est l’interpréteur de commandes par défaut sur de nombreux systèmes basés sur Unix. Cela en fait un choix plus sûr pour les scripts multiplateformes. Si vous avez besoin que vos scripts s’exécutent sur une grande variété de systèmes sans modification, Bash est une meilleure option.
- Complexité des scripts et fonctionnalités avancées : Zsh fournit des fonctionnalités avancées telles que les tableaux associatifs, les modèles de globbing étendus et l’expansion avancée des paramètres. Cela simplifie les tâches de scripting complexes. Si vos scripts nécessitent une manipulation avancée de chaînes ou des structures de données, Zsh est un meilleur choix.
- Communauté et écosystème de plugins : Bash et Zsh ont tous deux des communautés actives, mais Zsh possède une communauté plus importante et un vaste écosystème de plugins et de thèmes. Si vous appréciez la personnalisation, la communauté dynamique de Zsh et la prise en charge des plugins peuvent constituer un avantage significatif.
- Facilité d’apprentissage : si vous débutez dans les scripts shell, Bash est un point de départ plus accessible. Il propose une documentation complète et des ressources disponibles pour les débutants. Cela facilite l’apprentissage des bases des scripts shell.
Automatisation des tâches à l’aide de scripts shell
Savoir automatiser des tâches à l’aide de scripts shell est d’une grande importance. Vous pouvez automatiser les tâches répétitives et gagner beaucoup de temps.
Vous pouvez également utiliser ces scripts pour gérer les comptes d’utilisateurs, surveiller les ressources système, sauvegarder les données et effectuer la maintenance de routine. Lorsqu’ils sont soigneusement rédigés, ils peuvent également réduire le risque d’erreur humaine.