web-dev-qa-db-fra.com

Comment mettre un commentaire de ligne pour une commande multiligne

Je sais comment écrire une commande multiligne dans un script Bash, mais comment puis-je ajouter un commentaire pour chaque ligne d'une commande multiligne?

CommandName InputFiles      \ # This is the comment for the 1st line
            --option1 arg1  \ # This is the comment for the 2nd line
            --option2 arg2    # This is the comment for the 3nd line

Mais malheureusement, le commentaire après le caractère de suite \ interrompt la commande.

282
Peter Lee

Je crains qu'en général, vous ne puissiez pas faire ce que vous demandez. Le mieux que vous puissiez faire est de laisser un commentaire sur les lignes avant la commande, ou un seul commentaire à la fin de la ligne de commande, ou un commentaire après la commande.

Vous ne pouvez pas réussir à disperser des commentaires dans une commande de cette façon. Le \s exprime l'intention de fusionner des lignes. Vous essayez donc en fait de séparer des commentaires sur une seule ligne, ce qui ne fonctionne de toute façon pas parce qu'un \ doit être à la fin. de la ligne pour avoir cet effet.

60
Perry

C'est comme ça que je le fais. Essentiellement en utilisant le backtick de Bash substitution de commande , on peut placer ces commentaires n'importe où sur une longue ligne de commande, même si celle-ci est répartie sur plusieurs lignes. J'ai mis la commande echo devant votre exemple pour que vous puissiez l'exécuter et voir comment il fonctionne:

echo CommandName InputFiles `#1st comment` \
             --option1 arg1 `#2nd comment` \
             --option2 arg2 `#3rd comment`

Un autre exemple où vous pouvez mettre plusieurs commentaires à différents endroits de la même ligne:

some_cmd --opt1 `#1st comment` --opt2 `#2nd comment` --opt3 `#3rd comment`
547
Marwan Alsabbagh

Vous pouvez stocker les arguments dans un tableau:

args=(InputFiles      # This is the comment for the 1st line
      # You can have whole lines of comments in between, useful for:
      #--deprecated-option # This isn't use any more
      --option1 arg1  # This is the comment for the 2nd line

      # And even blank lines in between for readability
      --option2 arg2  # This is the comment for the 3nd line
     )
CommandName "${args[@]}"

Cependant, je pense que cela a l'air un peu ridicule si c'est uniquement dans le but de permettre des commentaires pour chaque argument. Par conséquent, je voudrais simplement réécrire le commentaire pour qu'il fasse référence aux arguments individuels et le mettre au-dessus de la commande entière.

71
Philipp

Basé sur le commentaire de pjh à autre réponse à cette question , en remplaçant IFS par une variable connue pour ne contenir aucun caractère non blanc.

comment=
who ${comment# This is the command} \
    -u ${comment# This is the argument}
16
chepner