Des commentaires lisibles sur des lignes distinctes dans une commande bash multiligne avec des pipelines?

14

Lors de la création de scripts shell à l'aide de pipelines et de l'utilisation de la barre oblique inverse pour continuer les lignes, je souhaite insérer des commentaires sur des lignes distinctes , de manière robuste, lisible et portable.

Par exemple, étant donné cette commande multi-lignes non commentée (volée à @DigitalRoss pour sa clarté):

echo abc |
     tr a-z A-Z |
     sort |
     uniq

... ce qui suit est esthétiquement le plus proche de ce que je veux accomplir, mais pour des raisons évidentes, ne fonctionne pas ... et oui, je suis bien conscient que ce n'est normalement pas quelque chose qui mérite d'être commenté:

# Perform critical system task.
# NOTE - An example of what does *not* work.
echo abc |
    # Convert lowercase to uppercase.
     tr a-z A-Z |

     # Sort the results.
     sort |

     # Only show unique lines.
     uniq

Les réponses connexes existantes me semblent insatisfaisantes , comme suit:

Tout d'abord, la réponse de glenn jackman (ajouter des arguments à un tableau, puis exécuter le tableau) fonctionne pour les commandes uniques, mais ne fonctionne pas pour le pipelining (et même si c'était le cas, cela ajoute de la complexité que j'aimerais éviter).

Deuxièmement, la réponse de @Gilles ici (qui utilise :) ne semble pas non plus fonctionner avec le pipelining, car elle modifie le flux du pipeline:

$ echo "abc" | :
$

( REMARQUE : s'il existe un équivalent :qui transmet la sortie non modifiée, ce serait esthétiquement acceptable, mais je n'ai pas pu en trouver un. Je pourrais en écrire un personnalisé, mais cela réduirait la portabilité.)

Enfin, la dernière partie de la réponse de DigitalRoss sur StackOverflow fonctionne bien pour ajouter des commentaires sur la même ligne, mais je préfère fortement les commentaires sur des lignes distinctes. Sinon, lorsque les lignes ont des longueurs très variables, la lisibilité est réduite:

echo abc |         # normal comment OK here`
     /usr/local/bin/really/long/path/ridiculously-long-filename.sh |  # another normal comment OK here
     sort |        # the pipelines are automatically continued
     uniq          # final comment

Je suis à la recherche de réponses qui préservent la lisibilité et minimisent la complexité, ou bien des informations sur pourquoi ce que je recherche est irréalisable.

Royce Williams
la source
1
Remarque sur vos commentaires: on m'a appris à écrire des commentaires expliquant une section ou une unité de travail. Si un codeur expérimenté écrit des commentaires intelligents décrivant ce qu'ils font, il est probable que quiconque suit le script peut toujours utiliser les pages de manuel s'il ne comprend pas les détails de l'utilisation. Il ne faut jamais écrire un commentaire comme i++; // increment i by one. Je vous suggère de lire "Les éléments du style de programmation"
bsd
Je pense que je vais supprimer la dernière modification. Il est inhabituel qu'une question contienne la question, les réfutations des réponses et la réponse elle-même, mais la partie qui explique pourquoi les autres réponses ne fonctionnent pas est un peu nécessaire ici. La réponse de rozcietrzewiacz et votre commentaire expliquent ensemble le problème (personnellement, j'aurais posté une réponse séparée et je l'aurais acceptée, car le problème était assez différent de ce qu'il a décrit, mais cela fonctionne)
Michael Mrozek
Compris - merci pour les commentaires; leçon apprise!
Royce Williams

Réponses:

14

Que dis-tu de ça?

echo abc | \
# Convert lowercase to uppercase.
tr a-z A-Z | \

# Sort the results.
sort | \

# Only show unique lines.
uniq

(La barre oblique inverse doit être utilisée comme dernier caractère de ces lignes.) Je ne suis pas sûr de la portabilité de cette approche, mais cela fonctionne bien avec le courant bash.

rozcietrzewiacz
la source
Ah! (facepalm) J'ai transformé l'idiome que j'utilisais réellement lors de la publication de la question sans m'en rendre compte! Je mettais le tuyau au début de chaque ligne, ce que je suis heureux d'arrêter de faire maintenant que je sais que cette méthode fonctionne bien sur tous les systèmes que je peux atteindre, à la fois en bash et sh. Merci!
Royce Williams
Ces commentaires ne gâcheraient-ils pas la suite des lignes?
Stuart P. Bentley
Tant qu'il y a une ligne vide avant chaque commentaire, cela fonctionne bien.
Royce Williams