Inline-Kommentare für Bash?

142

Ich möchte in der Lage sein, ein einzelnes Flag in einem einzeiligen Befehl auskommentieren zu können. Bash scheint nur from # till end-of-lineKommentare zu haben . Ich sehe Tricks wie:

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

Es ist hässlich, aber besser als nichts. Gibt es einen besseren Weg?

Folgendes scheint zu funktionieren, aber ich bin nicht sicher, ob es portabel ist:

ls -l `# -F is turned off` -a /etc
Lajos Nagy
quelle
Der #commentTrick wird auch hier erwähnt: stackoverflow.com/questions/9522631/…
Juha Palomäki
1
Nach dem Link erwähnt durch @Juha Palomäki, gibt es diesen wunderbaren Trick ${IFS#comment}von @pjh eingeführt in den Kommentaren. Es wird keine Unter-Shell aufgerufen.
Alexis

Antworten:

110

Mein bevorzugter ist:

Kommentieren in einem Bash-Skript

Dies hat einige Gemeinkosten, aber technisch beantwortet es Ihre Frage

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

Und speziell für Pipelines gibt es eine sauberere Lösung ohne Overhead

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

So setzen Sie einen Zeilenkommentar für einen mehrzeiligen Befehl

Rafareino
quelle
3
Beachten Sie, dass Sie Backticks verwenden müssen, $(#comment)funktioniert nicht.
Funroll
1
Einige Versionen betrachten dies )als Teil des Kommentars. Die meisten Herausforderungen von Bash sind auf die Retro-Kompatibilität mit älteren Versionen zurückzuführen, und eine gängige Strategie besteht darin, die älteste mögliche Lösung zu verwenden.
Rafareino
2
Beachten Sie, dass dies kein wirklicher Kommentar ist: Es true && `# comment` && trueist ein gültiger Ausdruck. Ein echter Kommentar würde so etwas wie syntax error near unexpected token
Sebastian Wagner
Sie haben Recht @sebastianwagner, beachten Sie auch, dass es in einem OP-Kurzschluss oder so etwas fehlschlagen würde, aber ich denke, es ist so gut wie wir können, ohne die Dinge viel zu komplizieren. Für mich ist es ein Zeichen dafür, dass man eine bessere Sprache braucht, aber es kann großartig sein, den bereits erstellten Code mit solchen 'Kommentaren' beizubehalten, um ihn zu dokumentieren.
Rafareino
Danke, das hat mir geholfen!
Xiarnousx
58

Ich finde es am einfachsten (und am besten lesbar), einfach die Zeile zu kopieren und die Originalversion zu kommentieren:

#Old version of ls:
#ls -l $([ ] && -F is turned off) -a /etc
ls -l -a /etc
Dan
quelle
Upvote für Klarheit. Ich weiß nicht, warum dies nicht die erste Option ist.
David Tabernero M.
aber dann ist es nicht inline? Ich nehme an, es ist fair zu sagen, dass die Notwendigkeit, Dinge zu tun, die nicht von Bash unterstützt werden, Anlass ist, einen anderen Weg zu finden
ThorSummoner
25

$(: ...) ist etwas weniger hässlich, aber immer noch nicht gut.

Ignacio Vazquez-Abrams
quelle
2
Durch diese Syntax wird eine Sub-Shell ausgelöst. Es wird angenommen, dass ein Kommentar die Redabilität verbessert, ohne das Code-Verhalten zu ändern. Die Zeit zum Starten / Beenden dieser Sub-Shell führt jedoch dazu, dass Ihr Code langsamer wird (gelinde gesagt). Warum nicht nur den Doppelpunkt am Anfang einer neuen Zeile verwenden?
Rafareino
1
Mit $ {IFS # ...} wird keine Sub-Shell aufgerufen.
Alexis
3
@ Rafareino: Ja. Aber im Ernst, in 95% der Anwendungen spielt dieser Overhead überhaupt keine Rolle. In vielen Fällen, in denen es darauf ankommt, wäre es wahrscheinlich eine gute Idee gewesen, zunächst eine schnellere Sprache als Bash zu verwenden.
links um den
... das Problem ist, dass die $(: ...)Syntax das Einbetten von Kommentaren nicht zuzulassen scheint: Während echo "foo" `# comment` "bar"der Kommentar beim zweiten Backtick beendet wird, analysiert das angebliche Äquivalent echo "foo" $(: # comment) "bar"nichts hinter dem #.
links um den
4

Wie wäre es, es in einer Variablen zu speichern?

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

Hier ist meine Lösung für Inline-Kommentare zwischen mehreren Pipe-Befehlen.

Beispiel für einen unkommentierten Code:

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

Lösung für einen Pipe-Kommentar (mithilfe einer Hilfsfunktion):

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

Oder wenn Sie es vorziehen, hier ist die gleiche Lösung ohne die Hilfsfunktion, aber es ist etwas chaotischer:

    #!/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
quelle
7
Nebenbei bemerkt, wenn Sie das Pipe-Zeichen an das Ende der vorherigen Zeile verschieben, können Sie die glücklichen Backslash-Newlines entfernen.
Tripleee
3

Bei den meisten Befehlen können Argumente in beliebiger Reihenfolge eingegeben werden. Bewegen Sie einfach die kommentierten Flags an das Ende der Zeile:

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

Um es wieder einzuschalten, kommentieren Sie einfach den Text aus und entfernen Sie ihn:

ls -l -a /etc -F
leedm777
quelle
1
Verdammt, ich habe #nach dem Befehl ohne ein einziges Leerzeichen hinzugefügt . Danke!
Asgs
1

Wenn Sie wissen, dass eine Variable leer ist, können Sie sie als Kommentar verwenden. Wenn es nicht leer ist, wird es natürlich Ihren Befehl durcheinander bringen.

ls -l $ {1 # -F ist ausgeschaltet} -a / etc.

§ 10.2. Parameterersetzung

Steven Penny
quelle
Verwenden Sie ${name:=comment}, um sicher zu sein.
can-ned_food
1

Um einen Teil eines Befehls wie zu deaktivieren a && b, habe ich einfach ein leeres Skript erstellt, xdas sich auf dem Pfad befindet, damit ich Folgendes tun kann:

mvn install && runProject

wenn ich bauen muss, und

x mvn install && runProject

wenn nicht (mit Ctrl + AundCtrl + E zum Anfang und Ende gehen).

Wie in den Kommentaren erwähnt, ist eine andere Möglichkeit, dies zu tun, Bash eingebaut :anstelle von x:

$  : Hello world, how are you? && echo "Fine."
Fine.
Ondra Žižka
quelle
2
Ein solches eingebautes gibt es bereits: :Wie in:string; of; commands; : disabled; enabled;
Xenithorb
Noch besser :) Danke
Ondra Žižka
-1

Wenn der Kommentar einen Kommentar wert ist, kann er wahrscheinlich am Ende der Zeile oder in einer eigenen Zeile stehen. Ich finde selten einen Bedarf an Inline-Kommentaren mit Code vor und nach dem Kommentar in einer beliebigen Sprache.

Oh, es gibt eine Ausnahme, nämlich den SQL-Dialekt, den ich normalerweise verwende und der '{Kommentare}' verwendet. Gelegentlich werde ich schreiben:

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

Aber auch das ist eine Strecke.

Jonathan Leffler
quelle