Les deux shells proposent des langages de script puissants, mais ils ne sont pas totalement compatibles.
En ce qui concerne les scripts shell sur les systèmes d'exploitation de type Unix, deux shells dominent: Bash (Bourne Again Shell) et Zsh (Z Shell). Si vous êtes programmeur ou administrateur système, le choix entre ces deux éléments a un impact significatif sur votre efficacité et votre productivité.
Comprendre les différences et les similitudes entre ces deux shells vous aidera à optimiser votre flux de travail en ligne de commande. Connaître les nuances de chaque coque vous aidera à prendre des décisions éclairées.
Que sont Bash et Zsh?
Bash est populaire sur les systèmes Linux et macOS. C'est un outil puissant que vous pouvez utiliser pour interagir avec le système d'exploitation et exécuter des commandes. Vous pouvez aussi utiliser Bash pour les scripts shell, qui automatise les tâches en écrivant des scripts contenant plusieurs commandes.
Zsh (Z shell) est une version étendue de Bash qui possède de nombreuses autres fonctionnalités. Il s'agit du shell par défaut sur macOS. Il devient également de plus en plus populaire sur les systèmes Linux.
Comment passer de Bash à Zsh
Si vous utilisez un système Linux et souhaitez passer à Zsh, commencez par en utilisant votre gestionnaire de paquets pour l'installer. Par exemple, sur Debian ou Ubuntu, utilisez la commande suivante :
sudo apt install zsh
Après l'avoir installé sur votre système, accédez-y en exécutant la commande suivante :
chsh -s $(which zsh)
Si vous utilisez macOS, Zsh est déjà installé. Pour y accéder, exécutez la commande suivante :
chsh -s /bin/zsh
Pour revenir à Bash, remplacez Zsh par Bash dans les commandes ci-dessus.
Pour vérifier quel shell vous utilisez, exécutez la commande suivante :
echo $SHELL
Cela vous aidera à confirmer que vous utilisez le shell souhaité.
Différences entre Zsh et Bash
Il existe plusieurs différences entre Zsh et Bash. La prise en compte de ces différences vous aidera à décider quelle coque vous convient le mieux.
1. Personnalisation rapide
Zsh offre un moyen plus simple de personnaliser vos invites en utilisant %-séquences d'échappement basées sur. Cela permet des invites dynamiques avec de la couleur et des informations. Pour personnaliser votre invite shell, définissez le PS1 (Invite principale).
PS1="%F{green}%n@%m %F{blue}%~ %f$ "
L'invite personnalisée ci-dessus affiche le nom d'utilisateur, le nom d'hôte et le répertoire actuel dans différentes couleurs :
Il y a beaucoup de autres façons de personnaliser l'invite Zsh, vous permettant de définir un indicateur d'administration, d'inclure la date et l'heure et d'enregistrer la nouvelle invite.
Bash utilise une approche légèrement différente en matière de personnalisation des invites. Il utilise des codes d'échappement pour spécifier les modifications de couleur et de formatage dans l'invite. Pour obtenir la même personnalisation que Zsh ci-dessus, vous pouvez utiliser l'invite personnalisée suivante.
PS1="\[\033[32m\]\u@\h \[\033[34m\]\w \[\033[0m\]\$ "
En utilisant \[\033[0m\] est crucial car il garantit que les changements de couleur n'affectent pas le texte qui suit l'invite.
2. Prise en charge des tableaux associatifs
Zsh prend en charge nativement les tableaux associatifs. Ces tableaux constituent un moyen pratique d'associer des données, ce qui facilite l'organisation et la récupération des informations. Utiliser déclarer-UN commande pour déclarer explicitement un tableau associatif :
# Declare an associative array in Zsh
declare -A my_assoc_array
Vous pouvez ensuite attribuer des valeurs au tableau associatif :
my_assoc_array=(key1 value1 key2 value2)
Et enfin, accédez aux valeurs à l'aide de leurs clés :
echo $my_assoc_array[key1] # Outputs: value1
Bash a inclus la prise en charge native des tableaux associatifs depuis la version 4.0. Vous déclarez et attribuez des valeurs de la même manière que dans Zsh. Mais lorsqu’il s’agit d’accéder aux valeurs du tableau, vous devez placer la clé entre accolades :
echo "${my_assoc_array[key1]}"
La principale différence est que la prise en charge par Zsh des tableaux associatifs est plus riche en fonctionnalités et plus avancée que celle de Bash. Zsh permet aux tableaux associatifs d'avoir des clés de différents types de données, pas seulement des chaînes. Bash ne prend en charge que les clés de chaîne.
Dans les versions antérieures de Bash, vous devez trouver un moyen de contourner le problème ou disposer d'outils externes pour utiliser des tableaux associatifs.
3. Modèles de globalisation étendus
Les modèles de globalisation étendus offrent un moyen puissant et flexible de sélectionner et de manipuler des fichiers et des répertoires en fonction de divers critères. Ils sont utiles lorsque vous travaillez avec 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 à l'aide du setopt commande. Par exemple, pour correspondre à tous .SMS fichiers dans le répertoire courant :
setopt extended_glob
txt_files=(*.txt)
Pour faire correspondre tous les fichiers sauf ceux avec l'extension .log :
setopt extended_glob
non_log_files=^(*.log)
Dans Bash, vous devez les activer à l'aide du magasiner commande avec le extglob option. Par exemple, pour correspondre à tous .SMS fichiers dans le répertoire courant :
shopt -s extglob
txt_files=(*.txt)
Pour faire correspondre tous les fichiers sauf ceux avec .enregistrer extension:
shopt -s extglob
non_log_files=!(*.log)
La principale différence entre Zsh et Bash en ce qui concerne les modèles de globalisation réside dans la commande utilisée pour les activer. Notez cependant que certains opérateurs sont différents entre les deux shells.
4. Extension des paramètres avancés
Zsh prend en charge 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 y parvenir, vous devez préfixer le nom de la variable avec un point d'exclamation !.
name="foo"
result="${!name}"
echo "$result"
Bash, en revanche, ne permet pas nativement une expansion indirecte. La solution de contournement consiste à utiliser le évaluer commande intégrée ou le ${!var} syntaxe pour les références de variables indirectes.
name="world"
var="name"
echo ${!var} # This will output: world
Similitudes entre Bash et Zsh
Bien qu'il existe des différences entre Bash et Zsh, ils partagent également certaines similitudes.
1. Syntaxe de la ligne de commande
Bash et Zsh partagent une syntaxe de ligne de commande similaire. C'est génial 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.
Il existe cependant des différences de syntaxe très mineures que vous devrez identifier et ajuster.
2. Cohérence de substitution de commande
La substitution de commande est le processus d'intégration du résultat d'une commande dans une autre. C’est cohérent entre les deux coques.
result=$(ls)
Dans Bash et Zsh, vous pouvez utiliser le $(commande) syntaxe pour remplacer la sortie d’une commande par une variable. Cela permet une portabilité facile des scripts entre les deux shells.
3. Option de débogage de script
Bash et Zsh utilisent tous deux -X indicateur pour le débogage du script. Lorsque vous exécutez un script avec cet indicateur, il affiche chaque commande avant son exécution. Cela vous aide à identifier les problèmes dans vos scripts.
# Debugging a script in both Bash and Zsh
#!/bin/bash -x
echo "Debugging Bash script"
Dans ce script Bash, le -X l'indicateur permet le débogage. Vous pouvez utiliser une approche similaire dans Zsh; il suffit de remplacer frapper avec zsh.
Considérations pour choisir entre Zsh et Bash
- Compatibilité et portabilité: Bash est le shell 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 un large éventail de systèmes sans modification, Bash est une meilleure option.
- Complexité du script et fonctionnalités avancées: Zsh fournit des fonctionnalités avancées telles que des tableaux associatifs, des modèles de globalisation étendus et une extension de paramètres avancée. Cela simplifie les tâches de script complexes. Si vos scripts nécessitent une manipulation avancée de chaînes ou des structures de données, Zsh est un meilleur choix.
- Écosystème de communauté et de plugins: Bash et Zsh ont tous deux des communautés actives, mais Zsh possède une communauté plus forte 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.