Möglichkeit, mehrzeilige Kommentare in Bash zu erstellen?


226

Ich habe vor kurzem angefangen, Shell-Skripte zu studieren, und ich möchte in der Lage sein, eine Reihe von Zeilen in einem Shell-Skript zu kommentieren. Ich meine, wie es im Fall von C / Java ist:

/* comment1
   comment2 
   comment3
*/`

Wie könnte ich das machen?


2
Sie können Hash wie folgt verwenden: #dies ist ein Kommentar.
Mohammad Tayyab

1
Ich weiß, aber es ist ein wenig lästig für Multiline.
Enes Malik Turhan

2
Es sollte beachtet werden, dass die folgenden Antworten erfordern, dass sich das :in der ersten Spalte (keine führenden Leerzeichen) in der Zeile befindet.
ty

Antworten:


394

Verwenden Sie : 'zu öffnen und 'zu schließen.

Beispielsweise:

: '
This is a
very neat comment
in bash
'

27
:( und fügt auch eine große Menge #
Fehlerquelle hinzu

51
@ jm666 IMHO Niemals eine gute Idee, das Wort niemals zu verwenden, wenn Sie keine Ahnung von allen Anwendungsfällen haben.
Winter

19
zu erklären: :ist eine Abkürzung für trueund trueverarbeitet keine Parameter. (Handbuchseite:SYNOPSIS true [ignored command line arguments]
phil294

46
Der Raum zwischen :und 'ist wichtig
Becko

23
Ich habe dies für Codeblöcke leicht geändert, damit ich den Code einfach ein- oder ausschalten kann. Meine Änderung besteht darin, # 'in der letzten Zeile anstelle des einfachen Anführungszeichens zu verwenden. Auf diese Weise kann ich eine einzelne #in die erste Zeile setzen, um den Codeblock zu aktivieren. Entfernen Sie die #erste Zeile, um den Code zu deaktivieren.
JohnMudd

131

Mehrzeiliger Kommentar in Bash

: <<'END_COMMENT'
This is a heredoc (<<) redirected to a NOP command (:).
The single quotes around END_COMMENT are important,
because it disables variable resolving and command resolving
within these lines.  Without the single-quotes around END_COMMENT,
the following two $() `` commands would get executed:
$(gibberish command)
`rm -fr mydir`
comment1
comment2 
comment3
END_COMMENT

4
Dies funktioniert, derzeit akzeptierte Antwort nicht (für mich).
Freek

5
Es ist wahrscheinlich erwähnenswert, dass dies an sich kein Kommentar ist. Dies ist ein Heredoc, der als mehrzeilige Zeichenfolge zum NOP-Befehl umgeleitet wird. Ein einfaches Anführungszeichen ist wichtig, um das Auflösen von Variablen und Befehlen zu deaktivieren.
Nux

1
@Freek muss Platz hinzufügen
Mazs

Ich habe dies in einem einfachen Bash-Skript getestet, das über die Shebang-Zeile #! / Bin / bash in Debian ausgeführt wird, und es ist fehlgeschlagen. Ich versuche jede Antwort auf dieser Seite und sie sind alle fehlgeschlagen, bis ich zu der unten stehenden komme. Da sie versagt haben, stimme ich sie ab und stimme denjenigen zu, der tatsächlich richtig läuft.
PyTis

1
Gute Tests in Ihrem Beispiel. Die Führung :ist nicht notwendig. Beginnen Sie einfach mit <<.
wisbucky

34

Ich aktualisiere diesen Beitrag basierend auf Kommentaren und anderen Antworten, sodass Kommentare vor dem 22. Mai 2020 möglicherweise nicht mehr zutreffen.

Bash bietet keine integrierte Syntax für mehrzeilige Kommentare, aber es gibt Hacks, die die vorhandene Bash-Syntax verwenden und "zufällig jetzt funktionieren".

Persönlich denke ich, dass das Einfachste (dh am wenigsten laut, am wenigsten seltsam, am einfachsten zu tippen, am explizitesten) darin besteht, ein zitiertes HEREDOC zu verwenden, aber machen Sie deutlich, was Sie tun, und verwenden Sie überall denselben HEREDOC-Marker:

<<'### BLOCK COMMENT'
line 1
line 2

line 3
line 4
### BLOCK COMMENT

Durch einfaches Zitieren des HEREDOC-Markers werden einige Nebenwirkungen des Shell-Parsing vermieden, z. B. seltsame Unterteilungen, die zum Absturz oder zur Ausgabe führen würden, und sogar das Parsen des Markers selbst. Die einfachen Anführungszeichen geben Ihnen also mehr Freiheit beim Öffnen und Schließen von Kommentaren. Im Folgenden wird beispielsweise ein dreifacher Hash verwendet, der einen mehrzeiligen Kommentar in Bash vorschlägt. Dies würde das Skript zum Absturz bringen, wenn die einfachen Anführungszeichen fehlen würden. Selbst wenn Sie das Skript entfernen ###, FOO{}stürzt das Skript ab (oder es wird eine schlechte Substitution gedruckt, wenn nein set -e), wenn die einfachen Anführungszeichen nicht vorhanden wären:

set -e

<<'### BLOCK COMMENT'
something something ${FOO{}} something
more comment
### BLOCK COMMENT

ls

Sie könnten natürlich einfach verwenden

set -e

<<'###'
something something ${FOO{}} something
more comment
###

ls

Aber die Absicht davon ist einem Leser, der mit diesem Trick nicht vertraut ist, definitiv weniger klar.

Heutzutage können Sie in jedem guten Editor Strg- / oder ähnliches drücken, um die Auswahl aufzuheben / zu kommentieren. Jeder versteht das definitiv:

# something something ${FOO{}} something
# more comment
# yet another line of comment

Obwohl dies zugegebenermaßen nicht annähernd so praktisch ist wie der obige Blockkommentar, wenn Sie Ihre Absätze neu füllen möchten.

Es gibt sicherlich andere Techniken, aber es scheint keinen "konventionellen" Weg zu geben, dies zu tun. Es wäre schön, wenn ###>und ###<könnte zu Bash hinzugefügt werden, um den Beginn und das Ende des Kommentarblocks anzuzeigen, scheint ziemlich einfach zu sein.


1
Ah, dieser ist einfach / sauber genug, um sich zu erinnern!
Thamme Gowda

1
Wie in der vorherigen Antwort erwähnt, wird neben den Anführungszeichen auch die Sequenz $ (...) erweitert, da beide Formulare eine Befehlssubstitution darstellen.
Perl Ancar

"Beide sind Hacks, damit sie in Zukunft Skripte brechen können." Könnten Sie das näher erläutern? Obwohl Hacks semantisch, syntaktisch gültig sind, sollten sie in Zukunft nicht brechen, es sei denn, bash beschließt, wütend zu werden und Heredocs zu brechen.
Perl Ancar

@perlancar Wenn wir uns einig sind, dass Hacks Lösungen sind, die eine Sprach- / Bibliotheksfunktion verwenden, die völlig unabhängig vom Problem ist (z. B. die Verwendung eines Heredocs für einen Kommentar oder die Verwendung eines Parameters für einen Do-Nothing-Befehl wie true), dann auch dann, wenn sie dies nicht tun Ich riskiere nicht zu brechen (Heredoc-Ansatz nicht, aber Doppelpunktversion). 1) Hacks verschleiern immer noch die Absicht: Ohne die erste Zeile, die auf mehrzeilige Kommentare hinweist, würden sich die meisten am Kopf kratzen und sich fragen, was dieser Code tut. und 2) unerwartete dunkle Ecken haben (wie das Verdoppeln eines Zitats, das Zitieren des Heredoc-Markers in bestimmten Fällen usw.).
Oliver

@Oliver: Wenn nicht notierte, Variablen können unangenehme Nebenwirkungen haben. Stellen Sie sich vor, Sie haben in Ihren Heredoc- Kommentar eine Zeichenfolge wie ${FOO:=bar}oder eingebettet ${FOO{}}. Der erste kann den Nebeneffekt haben, die Variable zu erstellen und festzulegen FOO, der zweite führt zu einem fehlerhaften Substitutionsfehler . Beide Effekte würden Sie von einem echten Kommentar nicht erwarten.
user1934428

24

Nachdem ich die anderen Antworten hier gelesen hatte, kam ich auf das Folgende, was meiner Meinung nach wirklich klar macht, dass es sich um einen Kommentar handelt. Besonders geeignet für Informationen zur Verwendung im Skript:

<< ////

Usage:
This script launches a spaceship to the moon. It's doing so by 
leveraging the power of the Fifth Element, AKA Leeloo.
Will only work if you're Bruce Willis or a relative of Milla Jovovich.

////

Als Programmierer wird die Folge von Schrägstrichen sofort in meinem Gehirn als Kommentar registriert (obwohl Schrägstriche normalerweise für Zeilenkommentare verwendet werden).

Natürlich "////"ist nur eine Zeichenfolge; Die Anzahl der Schrägstriche im Präfix und im Suffix muss gleich sein.


3
Ich habe fast dieUsage:
RNA

Tolle Ergänzung zu der obigen Antwort. Ehrlich gesagt, ich denke, Sie hätten die obige Antwort bearbeiten und hinzufügen können, anstatt separat zu antworten.
PyTis

Es gibt einige "oben" Antworten (abhängig von Ihrer Sortierreihenfolge). Und indem ich separat antwortete, wollte ich die Gründe für die von mir gewählte Zeichenfolge erläutern.
Noamtm

<< EOF ... EOF
Ich mingzhi

5

Was ist deine Meinung dazu?

function giveitauniquename()
{
  so this is a comment
  echo "there's no need to further escape apostrophes/etc if you are commenting your code this way"
  the drawback is it will be stored in memory as a function as long as your script runs unless you explicitly unset it
  only valid-ish bash allowed inside for instance these would not work without the "pound" signs:
  1, for #((
  2, this #wouldn't work either
  function giveitadifferentuniquename()
  {
    echo nestable
  }
}

Hallo, war nicht als Frage gedacht, sondern als Antwort auf die ursprüngliche Frage
Imre

Nicht gut IMO. Der Kommentar muss als Shell-Code analysiert werden können, was ziemlich restriktiv ist.
user1934428

3

Hier ist, wie ich mehrzeilige Kommentare in Bash mache.

Dieser Mechanismus hat zwei Vorteile, die ich schätze. Zum einen können Kommentare verschachtelt werden. Das andere ist, dass Blöcke aktiviert werden können, indem einfach die initiierende Zeile auskommentiert wird.

#!/bin/bash
# : <<'####.block.A'
echo "foo {" 1>&2
fn data1
echo "foo }" 1>&2
: <<'####.block.B'
fn data2 || exit
exit 1
####.block.B
echo "can't happen" 1>&2
####.block.A

Im obigen Beispiel ist der "B" -Block auskommentiert, aber die Teile des "A" -Blocks, die nicht der "B" -Block sind, werden nicht auskommentiert.

Wenn Sie dieses Beispiel ausführen, wird folgende Ausgabe erstellt:

foo {
./example: line 5: fn: command not found
foo }
can't happen

3

Ich habe die gewählte Antwort ausprobiert, aber als ich ein Shell-Skript mit diesem Skript ausführte, wurde das Ganze auf dem Bildschirm gedruckt (ähnlich wie Jupiter-Notizbücher alles in '''xx'''Anführungszeichen drucken ), und am Ende wurde eine Fehlermeldung angezeigt . Es tat nichts, aber: beängstigend . Dann wurde mir beim Bearbeiten klar, dass einfache Anführungszeichen mehrere Zeilen umfassen können. Also .. lassen Sie uns einfach den Block einer Variablen zuweisen.

x='
echo "these lines will all become comments."
echo "just make sure you don_t use single-quotes!"

ls -l
date

'

Nur keine Notwendigkeit , es zu einer Variablen zuzuweisen, die ist ein Nebeneffekt würden wir nicht von einem ‚Kommentar‘ erwarten. Ersetzen Sie das x=durch a : und Sie haben den gleichen Effekt ohne Nebenwirkungen. Der einzige Nachteil ist, dass der Kommentar dann kein einziges Anführungszeichen enthalten darf. Deshalb bevorzuge ich die Verwendung eines zitierten Heredocs: Damit kann der Kommentator eine geeignete Terminierungszeichenfolge auswählen, wie er möchte.
user1934428

2

Einfache Lösung, nicht viel klug:

Blockieren Sie vorübergehend einen Teil eines Skripts:

if false; then
    while you respect syntax a bit, please
    do write here (almost) whatever you want.
    but when you are
    done # write
fi

Eine etwas raffinierte Version:

time_of_debug=false # Let's set this variable at the beginning of a script

if $time_of_debug; then # in a middle of the script  
    echo I keep this code aside until there is the time of debug!
fi

-2

# Ich mag Faulheit und Einfachheit. Ich würde # mit einer lustigen Problemumgehung verwenden:

1 DRÜCKEN SIE:] find Strg + F oder cmd + F oder was auch immer [um die Suchfunktion auszulösen

2 Verwenden Sie im Suchfeld einen regulären Ausdruck wie: (^.+)

3 ersetzen durch: # $1oder wenn Sie es vorziehen#$1


# Hinweis: Möglicherweise haben Sie die drei Schritte nicht in Ihrem Editor. Verwenden Sie in diesem Fall ein Online-Regex-Tool (aus politischen Gründen kann hier kein Tool vorgeschlagen werden):

  1. Wählen Sie den Text aus, kopieren Sie ihn an einer beliebigen Stelle und fügen Sie ihn in das Online-Regex-Tool ein
  2. Verwendung (^.+)als Regex und / #$1oder #\1als Substitutionsmuster
  3. Wählen Sie den Text aus, kopieren Sie ihn und fügen Sie ihn wieder dort ein, wo Sie begonnen haben

# Genieße deine Hashes!


Heutzutage haben viele Redakteure den Hotkey, mit ctrl+/dem Kommentare auch für mehrere Zeilen ein- oder ausgeschaltet werden können. Es ist auch in der Lage, das Kommentarzeichen basierend auf der von Ihnen verwendeten Sprache zu ändern.
NinMonkey
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.