Commentaires en ligne pour Bash?

142

Je voudrais pouvoir commenter un seul drapeau dans une commande sur une ligne. Bash ne semble avoir que des from # till end-of-linecommentaires. Je regarde des trucs comme:

ls -l $([ ] && -F is turned off) -a /etc

C'est moche, mais mieux que rien. Y a-t-il un meilleur moyen?

Ce qui suit semble fonctionner, mais je ne suis pas sûr qu'il soit portable:

ls -l `# -F is turned off` -a /etc
Lajos Nagy
la source
L' #commentastuce est également mentionnée ici: stackoverflow.com/questions/9522631/…
Juha Palomäki
1
En suivant le lien mentionné par @Juha Palomäki, il y a cette merveilleuse astuce ${IFS#comment}introduite par @pjh dans les commentaires. Aucun sous-shell n'est appelé.
alexis

Réponses:

110

Mon préféré est:

Commenter dans un script Bash

Cela entraînera des frais généraux, mais techniquement, cela répond à votre question

echo abc `#put your comment here` \
     def `#another chance for a comment` \
     xyz etc

Et pour les pipelines en particulier, il existe une solution plus propre sans frais généraux

echo abc |        # normal comment OK here
     tr a-z A-Z | # another normal comment OK here
     sort |       # the pipelines are automatically continued
     uniq         # final comment

Comment mettre un commentaire de ligne pour une commande multiligne

Rafareino
la source
3
Notez que vous devez utiliser des backticks, $(#comment)cela ne fonctionne pas.
funroll du
1
Certaines versions considéreront le )comme faisant partie du commentaire lui-même. La plupart des défis de bash sont dus à la rétro-compatibilité avec les anciennes versions, et une stratégie courante consiste à utiliser la solution la plus ancienne possible.
Rafareino le
2
Attention, ce n'est pas un vrai commentaire: true && `# comment` && truec'est une expression valide. Un vrai commentaire générerait quelque chose comme: syntax error near unexpected token && ''
Sebastian Wagner
Vous avez raison @sebastianwagner, notez également que cela échouerait dans un court-circuit OU ou quelque chose du genre, mais je pense que c'est aussi bien que nous pouvons l'obtenir sans trop compliquer les choses. Pour moi, c'est un signe que l'on a besoin d'un meilleur langage, mais cela peut faire très bien, en conservant le code déjà construit avec de tels «commentaires» pour le documenter.
Rafareino
Merci qui m'a aidé!
xiarnousx
58

Je trouve qu'il est plus facile (et plus lisible) de simplement copier la ligne et de commenter la version originale:

#Old version of ls:
#ls -l $([ ] && -F is turned off) -a /etc
ls -l -a /etc
Dan
la source
Un vote favorable pour plus de clarté. Je ne sais pas pourquoi ce n'est pas la première option.
David Tabernero M.
mais alors ce n'est pas en ligne? Je suppose qu'il est juste de dire que le besoin de faire des choses qui ne sont pas prises en charge par bash est une raison de trouver un autre moyen
ThorSummoner
25

$(: ...) est un peu moins moche, mais toujours pas bon.

Ignacio Vazquez-Abrams
la source
2
Par cette syntaxe, vous lancez un sous-shell, un commentaire est proposé pour améliorer la réductibilité sans changer du tout le comportement du code, mais le temps de lancer / terminer ce sous-shell rendra votre code plus lent (c'est le moins qu'on puisse dire), pourquoi ne pas utiliser uniquement les deux points au début d'une nouvelle ligne?
Rafareino
1
Avec $ {IFS # ...} aucun sous-shell n'est appelé.
alexis
3
@Rafareino: ouais. Mais sérieusement, dans 95% des applications, cette surcharge n'aura aucune importance. Dans la plupart des cas où cela compte, il aurait probablement été une bonne idée d'utiliser un langage plus rapide que Bash en premier lieu.
gauche vers le
... le problème, c'est que la $(: ...)syntaxe ne semble pas autoriser l'incorporation de commentaires: alors echo "foo" `# comment` "bar"qu'elle terminera le commentaire au deuxième backtick, l'équivalent supposé n'analyse echo "foo" $(: # comment) "bar"rien derrière le #.
gauche vers le
4

Que diriez-vous de le stocker dans une variable?

#extraargs=-F
ls -l $extraargs -a /etc
Karoly Horvath
la source
4

Voici ma solution pour les commentaires en ligne entre plusieurs commandes canalisées.

Exemple de code non commenté:

    #!/bin/sh
    cat input.txt \
    | grep something \
    | sort -r

Solution pour un commentaire de pipe (en utilisant une fonction d'assistance):

    #!/bin/sh
    pipe_comment() {
        cat - 
    }
    cat input.txt \
    | pipe_comment "filter down to lines that contain the word: something" \
    | grep something \
    | pipe_comment "reverse sort what is left" \
    | sort -r

Ou si vous préférez, voici la même solution sans la fonction d'assistance, mais c'est un peu plus compliqué:

    #!/bin/sh
    cat input.txt \
    | cat - `: filter down to lines that contain the word: something` \
    | grep something \
    | cat - `: reverse sort what is left` \
    | sort -r
KylePDavis
la source
7
En passant, si vous déplacez le caractère de pipe à la fin de la ligne précédente, vous pouvez vous débarrasser des nouvelles lignes anti-slash dégueulasses.
tripleee
3

La plupart des commandes permettent aux arguments d'arriver dans n'importe quel ordre. Déplacez simplement les indicateurs commentés à la fin de la ligne:

ls -l -a /etc # -F is turned off

Ensuite, pour le réactiver, décommentez et supprimez le texte:

ls -l -a /etc -F
leedm777
la source
1
putain, j'ai ajouté #sans un seul espace après la commande. Merci!
asgs
1

Si vous savez qu'une variable est vide, vous pouvez l'utiliser comme commentaire. Bien sûr, s'il n'est pas vide, cela gâchera votre commande.

ls -l $ {1 # -F est désactivé} -a / etc

§ 10.2. Substitution de paramètres

Steven Penny
la source
Utilisez ${name:=comment}pour être en sécurité.
can-ned_food
1

Pour désactiver une partie d'une commande comme a && b, j'ai simplement créé un script vide xqui est sur le chemin, donc je peux faire des choses comme:

mvn install && runProject

quand j'ai besoin de construire, et

x mvn install && runProject

quand ce n'est pas le cas (en utilisant Ctrl + Aet Ctrl + Epour aller au début et à la fin).

Comme indiqué dans les commentaires, une autre façon de le faire est Bash intégré au :lieu de x:

$  : Hello world, how are you? && echo "Fine."
Fine.
Ondra Žižka
la source
2
Un tel builtin existe déjà: :Comme dans:string; of; commands; : disabled; enabled;
xenithorb
Encore mieux :) Merci
Ondra Žižka
-1

Si le commentaire vaut la peine d'être fait, il peut probablement figurer à la fin de la ligne ou sur une ligne seule. Je trouve rarement le besoin de commentaires intra-ligne avec du code avant et après le commentaire dans n'importe quelle langue.

Oh, il y a une exception, qui est le dialecte de SQL que j'utilise habituellement et qui utilise «{comments}». Parfois, j'écrirai:

CREATE UNIQUE INDEX u1_table ON Table(...);
CREATE {DUPS} INDEX d1_table ON Table(...);

Mais même cela est un peu exagéré.

Jonathan Leffler
la source