Les bizarreries de bash

Le problème exposé dans ce sujet a été résolu.

Ah en fait c’est tout simple. Le ## indique qu’on souhaite supprimer en début de chaine la première occurrence de [insérer ici n’importe quoi]/.

Green

Ça, c’est la définition de #. ;)
Si tu utilises ## cela signifie « la plus longue occurrence ».

Autrement dit, si la chaîne chaine contient /on/a/parcouru/le/chemin :

  • ${chaine#*/} donnera on/a/parcouru/le/chemin ;
  • ${chaine##*/} donnera chemin.

Et j’avais aussi croisé le même genre de commande mais en remplaçant ## par %. c’est la même chose appliqué à toutes les occurrences?

charlie02

Les symboles % et %% sont identiques aux autres si ce n’est qu’ils travaillent depuis la fin de la chaîne.

+1 -0

Un autre bizarrerie de Bash…

J’ai un répertoire nommé mesMusiques contenant une petite centaine de fichiers .mp3 cachés parmi des milliers de fichiers et de sous-répertoires quelconques.

Comment afficher la liste des musiques MP3 en utilisant la commande ls ?

ls -R affiche tous les fichiers contenus dans mesMusiques, peut importe le niveau dans l’arborescence. Mais ls -R *.mp3 n’affiche plus que les fichiers MP3 dans la première arborescence, une idée de pourquoi ?

Ça n’est en rien étrange ça: tu viens de lui demander de te lister récursivement tous les éléments dont le nom se terminait par .mp3 (donc il a pris la liste des éléments dans le dossier courant, n’a gardé que ce qui se terminait par .mp3 puis a cherché tous les dossiers à dérouler (soit aucuns à moins que tu aies un dossier qui aie un nom du style mondossier.mp3)).

Pour réussir à faire ce que tu veux, tu as plusieurs options:

  • Si tu ne veux que leurs noms (et pas leurs emplacements): ls -R | grep \\.mp3$. Là tu récupère le nom de tous les éléments, et tu ne garde que ce qui se termine par .mp3.
  • Si tu veux aussi leur emplacement, tu fais: find . -name *.mp3 qui va te trouver récursivement le nom de tout les fichiers mp3 et te donner leurs chemins (le point de départ concaténé aux chemins relatifs des fichier par rapport à lui.).
+0 -0

Ça n’est en rien étrange ça: tu viens de lui demander de te lister récursivement tous les éléments dont le nom se terminait par .mp3 (donc il a pris la liste des éléments dans le dossier courant, n’a gardé que ce qui se terminait par .mp3 puis a cherché tous les dossiers à dérouler (soit aucuns à moins que tu aies un dossier qui aie un nom du style mondossier.mp3)).

charlie02

L’explication à cela est que l’expansion du wildcard est faite par le shell, pas par ls, qui lui va être appelé avec en arguments a.mp3 b.mp3 c.mp3 ..., sans explorer l’arborescence.

Avec certains shells tu pourrais utiliser **/*.mp3, mais je ne crois pas que ce soit le cas de bash.

Bash est pratique en administration système. Pas propre, pas lisible, mais tellement pratique. Faut juste savoir quand on atteint ses limites.

Bash a deux façon d’être utilisé : la première, à l’arrache, très pratique pour les one-liners et scripts sur le coin de la table bourrés d’astuces du langage, mais qui permettent de résoudre rapidement et ponctuellement une problématique. Et là Python ou autre est totalement inadapté (même s’il existe des modules propres, je vous mets au défi d’utiliser Python comme shell interactif…).

La seconde, plus propre et lisible, consiste à simplement mettre des bouts d’algos autour de commandes (et il faut bien le voir comme ça), pour simplifier des tâches récurrentes. Là Python ou autre peut sans doute le remplacer, mais est-ce vraiment utile ? Et serait-ce vraiment plus pratique, quand ton script appelle énormément de commandes externes, manipule beaucoup de fichiers, dossiers, etc.

Après, je dis ça mais je suis un mauvais exemple, j’abuse de Bash dans des situations où il est totalement inadapté (cf. https://git.breizh.pm/Breizh/files.breizh.pm), mais c’est le langage que je maîtrise le mieux…

Du coup je m’adresse aux administrateurs système (et uniquement à eux : les devs qui font du code propre ont forcément des reproches à faire à Bash, et je comprends tout à fait — je serais le premier à gueuler contre un dev qui coderait un programme comme on fait un one-liner ou un script jetable en Bash – mais du coup inversement, je demande à ce qu’on comprenne bien que c’est pas le même usage) : quelles alternatives à Bash utilisez-vous (en interactif ou en script) si vous le trouvez mal fichu ?

Et j’aimerais bien voir une comparaison de scripts identiques mais écrit en Bash vs. Python (ou autre). Le soucis c’est que la plupart des miens sont soit très simples (où Bash a toute sa place, selon moi, si vous pensez le contraire, je peux donner des exemples) soit très complexes (où je sais très bien que Python fera mieux), ceux où la distinction est plus difficile ont été fait dans le cadre de mon taf, je ne peux les partager comme ça… :/

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte