it-swarm.com.de

So fügen Sie einen Zeilenkommentar für einen mehrzeiligen Befehl ein

Ich weiß, wie man einen mehrzeiligen Befehl in ein Bash-Skript schreibt, aber wie kann ich einen Kommentar für jede Zeile in einem mehrzeiligen Befehl hinzufügen?

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

Aber leider ist der Kommentar nach Fortsetzungszeichen \ unterbricht den Befehl.

282
Peter Lee

Ich fürchte, dass Sie im Allgemeinen nicht das tun können, wonach Sie fragen. Das Beste, was Sie tun können, ist ein Kommentar in den Zeilen vor dem Befehl oder ein einzelner Kommentar am Ende der Befehlszeile oder ein Kommentar nach dem Befehl.

Sie können auf diese Weise keine Kommentare in einen Befehl einfügen. Das \s drückt die Absicht aus, Zeilen zusammenzuführen. Daher versuchen Sie in jeder Hinsicht, Kommentare in eine einzelne Zeile einzufügen, was ohnehin nicht funktioniert, da ein \ muss am Ende der Zeile stehen, um diesen Effekt zu erzielen.

60
Perry

So mache ich es. Im Wesentlichen kann man mit Bashs Backtick Befehlsersetzung diese Kommentare an einer beliebigen Stelle entlang einer langen Befehlszeile platzieren, auch wenn sie über mehrere Zeilen verteilt sind. Ich habe den Befehl echo vor Ihr Beispiel gestellt, damit Sie das Beispiel ausführen und sehen können, wie es funktioniert:

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

Ein weiteres Beispiel, in dem Sie mehrere Kommentare an verschiedenen Punkten in eine Zeile einfügen können:

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

Sie können die Argumente in einem Array speichern:

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[@]}"

Ich denke jedoch, dass dies ein bisschen hackisch aussieht, wenn es nur dazu dient, Kommentare für jedes Argument zuzulassen. Deshalb schreibe ich den Kommentar einfach so um, dass er auf die einzelnen Argumente verweist, und setze ihn über den gesamten Befehl.

71
Philipp

Basierend auf dem Kommentar von pjh zu eine weitere Antwort auf diese Frage , Ersetzen von IFS durch eine Variable, von der bekannt ist, dass sie keine Nicht-Leerzeichen enthält.

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