2010-03-26 10 views
96

Je voudrais être en mesure de commenter un seul drapeau dans une commande d'une ligne. Bash semble seulement avoir from # till end-of-line commentaires. Je regarde des trucs comme:Commentaires en ligne pour Bash?

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 que ce soit portable:

ls -l `# -F is turned off` -a /etc 
+0

L'astuce '# de comment' est également mentionné ici: http://stackoverflow.com/questions/9522631/bash-comment-mettre-en-ligne-commenter-pour-une-commande-multi-ligne –

+0

Suite au [link] (http://stackoverflow.com/a/12797512/1342186) mentionné par @Juha Palomäki , il y a cette astuce merveilleuse '$ {IFS # comment}' introduite par @pjh dans les commentaires. Aucune sous-shell n'est invoquée. – alexis

Répondre

14

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

+0

Par cette syntaxe vous déclenchez un sous-shell, un commentaire est proposé pour améliorer la redéfinition sans changer le comportement du code, mais le temps de lancement/fin de ce sous-shell rendra votre code plus lent (c'est le moins qu'on puisse dire) , pourquoi ne pas utiliser seulement le colon au début d'une nouvelle ligne? – Rafareino

+0

Avec $ {IFS # ...} aucun sous-shell n'est invoqué. – alexis

+0

@Rafareino: oui. Mais sérieusement, dans 95% des applications, ces frais généraux n'auront aucune importance. Pour de nombreux cas, cela aurait probablement été une bonne idée d'utiliser un langage plus rapide que Bash en premier lieu. – leftaroundabout

0

Si le commentaire vaut la peine d'être fait, il peut probablement aller à la fin de la ligne ou sur une ligne isolée. Je trouve rarement un besoin de commentaires internes avec le 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 qui utilise '{comments}'. De temps en temps, j'écrirai:

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

Mais même cela est un étirement.

45

je trouve qu'il est plus facile (et plus lisible) pour copier simplement la ligne et commentez la version originale:

#Old version of ls: 
#ls -l $([ ] && -F is turned off) -a /etc 
ls -l -a /etc 
+0

Upvote pour plus de clarté. Je ne sais pas pourquoi ce n'est pas la première option. – Davdriver

1

La plupart des commandes permettent args à venir dans un ordre quelconque. Il suffit de déplacer les drapeaux de commentaires à la fin de la ligne:

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

Puis Rallumez-le, juste décommenter et supprimer le texte:

ls -l -a /etc -F 
2

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

Exemple Code décommentée:

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

Solution pour un commentaire de conduite (en utilisant une fonction d'aide):

#!/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'aide, mais il est un peu messier:

#!/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 
+4

En passant, si vous déplacez le caractère de tuyau à la fin de la ligne précédente, vous pouvez vous débarrasser des barres obliques inversées. – tripleee

4

Que diriez-vous de le stocker dans une variable?

#extraargs=-F 
ls -l $extraargs -a /etc 
1

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

 
ls -l ${1# -F is turned off} -a /etc 

§ 10.2. Parameter Substitution

50

Mon préféré est:

Commenting in BASH script

Cela aura certains frais généraux, mais techniquement, il ne 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 y a une solution 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 

How to Put Line Comment for a Multi-line Command

+1

Notez que vous devez utiliser des backticks, '$ (# comment)' ne fonctionne pas. – funroll

+1

Pourquoi '$()' ne fonctionne pas? – Hendrikto

+1

Certaines versions considèrent le ')' dans le commentaire lui-même. La plupart des défis de bash sont dus à une compatibilité rétro avec les anciennes versions, et une stratégie commune consiste à utiliser la solution la plus ancienne possible. – Rafareino

0

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

mvn install && runProject 

quand je dois construire, et

x mvn install && runProject 

lorsqu'ils ne sont pas (en utilisant Ctrl + A et Ctrl + E pour passer 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. 
+1

Un tel builtin existe déjà: ':' Comme dans: 'string; de; commandes : désactivée; activé; ' – xenithorb

+0

Encore mieux :) Merci –

Questions connexes