9
votes

Continuation de la ligne + commentaire de ligne, sur la même ligne?

J'ai un appel avec une jolie liste d'arguments dans mon script shell: xxx

ne peut pas insérer des commentaires dans cet appel multiligne, puis-je?

Par exemple, disons comment puis-je commenter le - une ligne à bascule en option ?
Comment puis-je ajouter un # dans la commande triée Commentaire après $ Arguments ?

Peu importe ce que j'essaie, le grevoir # Symbole Shadows Line Suite Backslash \ ou vice versa. Tout conseiller?


0 commentaires

3 Réponses :


1
votes
foo-command $(
    # hello
    printf --important-argument $ONE # free as a bird
    printf --indispensable-flag $ENABLED
    # to comment anywhere we wish
    printf --an-optional-toggle "will probably be commented out some day"
    printf $ARGUMENTS
    printf $MORE_ARGUMENTS
)
It's not perfect: echoing -n is hard because echo interprets it; quotes may be disappeared when you would prefer to keep them, etc.  In fact as commenters say below, the quoted string will get mangled; maybe you can work around that, but other answers here are better if you have Bash.

8 commentaires

Si l'argument sur le commentaire facultatif contient réellement des espaces, cela ne fonctionnera pas.


Cela peut être amélioré. printf au lieu de echo atténuera certains problèmes, y compris -n (et d'autres) interprétation. La substitution de commande peut être inlinée et se débarrasser d'une définition de fonction supplémentaire.


Vous avez raison, la réponse de Cheppner est une meilleure version meilleure de ce que j'ai fait ici. Tout grêle le maître Bash.


@Johnzwinck, remonter le moral! Votre solution a un avantage d'être portable , dans le sens de la compatibilité avec la nature sh .


@ulidtko: Merci. Je ne voudrais pas simplement sh sur mon pire ennemi. Je pense qu'il est mieux que ed . :)


@Lidtko La portabilité n'a pas d'importance si ce n'est pas correct. Cependant, je pensais que je me suis souvenu de quelqu'un qui me disait que des tableaux peuvent être ajoutés à la spécification POSIX. Il n'y a vraiment pas une alternative portable à leur utilisation dans un cas comme celle-ci, à court d'une construction vraiment horrible impliquant eval .


(Hm, ce pourrait être une citation de style ansi $ '' ... ' que j'ai entendu être sous délibération. Mais les tableaux seraient utiles aussi.)


Notez que printf (1) essaie d'élargir son premier argument, donc à l'aide de la LIMAINE PrintF $ Arguments n'est pas une très bonne idée. printf "% s \ n" $ arguments est meilleur.



7
votes

Non, mais vous pouvez stocker les arguments dans un tableau à la place. Cela vous permet de commenter une ligne individuelle et d'inclure des commentaires entrecoupés.

args=( --important-argument "$ONE"
       --indispensable-flag "$ENABLED"
       # --an-optional-toggle "will probably be commented out some day"
       "${ARGUMENTS[@]}"  # in sorted order
       "${MORE_ARGUMENTS[@]}"
     )


4 commentaires

+1 Utilisation des matrices Bash est la bonne façon que d'utiliser une ligne de commande multiligne longue.


Comme une note de côté: il est strictement une approche dépendant de Bash. Les tableaux ne fonctionnent pas dans des coquilles plus âgés a.k.a « sh », qui peut être d'une importance pour quelqu'un.


Si vous êtes préoccupé par la portabilité, taguer votre question sh au lieu de bash .


Il convient probablement de noter qu'utiliser un tableau avec "$ {arguments [@]}" au lieu d'une plaine, non note $ Arguments évite l'expansion indésirable de la valeur.



6
votes

Essayez backtick commentaire bidouille em> comme proposé dans une réponse antérieure à la même question

dans votre cas, ce serait:. p>

foo-command \
    --important-argument $ONE \
    --indispensable-flag $ENABLED \
    `#--an-optional-toggle "will probably be commented out some day"` \
    $ARGUMENTS \
    $MORE_ARGUMENTS


1 commentaires

Veillez à ce que la ligne a commenté ne se contient pas de substitutions de commandes, car ils seront encore élargis.