Bash sur la ligne de commande

Anne bash linux

Bien sûr, le langage bash est le même qu’on l’utilise dans des scripts, comme présenté ici ou sur la ligne de commande, mais on ne s’y prend pas forcement exactement pareil. Voilà donc quelques lignes de commande utiles.

Compter les lignes

Une mauvaise idée est de faire :

$ find . -name "*.c" | wc -l

car ça compte le nombre de fichiers et non le nombre de lignes des fichiers.

Une première idée est de faire :

$ find . -name "*.c" | wc -l --files0-from=-

Mais si le nombre de fichier est trop grand, cela donne Nom de fichier trop long.

Pour que ça marche, il suffit d’utiliser l’option -print0 de find :

$ find . -name "*.c" -print0 | wc -l --files0-from=-

Une solution plus élégante est de faire :

$ wc -l $(find . -name "*.c")

car en plus, on profite du joli formatage de wc.

Définir une variable temporaire

Il est souvent utile d’ajouter une variable dans l’environnement avant d’appeler une commande. Le manuel de bash dit :

The environment for any simple command or function may be augmented temporarily by prefixing it with parameter  assignments,  as described above in PARAMETERS. These assignment statements affect only the environment seen by that command.

Ce qui laisse penser qu’on peut faire :

$ NAME=toto ma_cmd

mais ça ne fonctionne pas, ou en tout cas pas toujours. Par exemple:

$ NAME=toto echo "Bonjour $NAME"

ne fonctionne pas car ici, $NAME est évalué avant d'être affecté. Pour que ça fonctionne, il faut forcer l’affectation avant l'évaluation, en faisant par exemple :

$ (NAME=toto && echo "Bonjour $NAME")

ou :

$ (NAME=toto ; echo "Bonjour $NAME")

Attention, les parenthèses sont utiles pour ne pas modifier l’environnement courant. Pour plus d’explication, voir sur StackOverflow.

Dans d’autres cas problématiques (mais je ne me souviens plus du contexte), il faut parfois utiliser :

$ env NAME=toto ma_cmd

Voir aussi :