unixmaniax.frLE CARNET DES SYSTÈMES UNIX

Linux / Linux

Bash : commandes, scripts et erreurs à éviter

Reprendre les bases du shell du wiki avec des variables protégées, des codes de retour contrôlés et des exemples utilisables dans un dossier de test.

Distinguer le shell et les programmes

Le wiki rassemblait sous « commandes Bash » aussi bien cd, une commande interne, que ls ou cp, des programmes. Cette distinction explique pourquoi un alias, une fonction et un exécutable peuvent partager un nom. Utilisez type pour savoir ce que le shell exécutera.

Travaillez dans un dossier d’essai. Vérifiez le chemin courant avant une copie ou un déplacement et mettez les chemins variables entre guillemets. Les espaces et les caractères spéciaux dans les noms de fichiers ne sont pas des cas exceptionnels à ignorer.

pwd
type cd
type ls
mkdir -p -- "$PWD/essai-shell"

Faire remonter les erreurs du script

Les opérateurs && et || ne sont pas des « ET/OU exclusifs » : la seconde commande dépend du code de retour de la première. Dans Bash, pipefail permet à un pipeline de signaler l’échec d’une commande amont ; sans cette option, on peut ne voir que le succès du dernier programme.

Vérifiez les arguments et citez les expansions. Un mode strict n’est pas une preuve de correction : les conditions, pipelines et commandes exécutées dans des sous-contextes demandent des tests. Utilisez un fichier temporaire créé avec mktemp et un nettoyage explicite pour les tâches qui produisent un résultat.

#!/usr/bin/env bash
set -u
set -o pipefail
if [ "$#" -ne 1 ] || [ ! -d "$1" ]; then
  printf "%s\n" "Usage : $0 repertoire" >&2
  exit 2
fi
if ! du -sh -- "$1"; then
  printf "%s\n" "Mesure impossible" >&2
  exit 1
fi

Chercher et diagnostiquer sans fragiliser le script

file aide à identifier le type apparent d’un fichier ; une recherche récursive avec grep retrouve une expression dans une arborescence. La nature annoncée d’un fichier ne garantit ni sa sécurité ni son intégrité. Pour une recherche textuelle, précisez si le motif doit être littéral plutôt qu’une expression régulière.

Évitez de construire une boucle sur la sortie de ls : elle peut mal gérer les noms contenant des espaces ou des retours à la ligne. Les anciennes astuces interactives doivent être réévaluées avant d’entrer dans un script automatique. Conservez stderr et le code de retour pour diagnostiquer les échecs.

file -- document.dat
grep -RFn -- "texte exact" ./repertoire

Sources & documentation

Consultez la documentation correspondant à vos versions avant d’appliquer les exemples. Les commandes illustrent la méthode ; elles ne remplacent pas un essai dans votre environnement.