Terminal zeigt> nach Eingabe von \

Antworten:

35

Immer wenn Sie die Befehlszeile verwenden, kann es vorkommen, dass Sie einen sehr langen Befehl ausführen müssen. Sie möchten den Befehl daher zur besseren Lesbarkeit und zum besseren Verständnis in mehrere Zeilen aufteilen. Wenn Sie jedoch ein neues Zeilenzeichen verwenden Enter, das von eingegeben wird , wird die Shell denken, dass es sich um einen neuen Befehl handelt. Sie verwenden also \gefolgt vom Zeilenvorschub.

Grundsätzlich werden Befehle oder Bash-Skripte "interpretiert", dh zeilenweise ausgeführt. Jede neue Zeile bedeutet den Beginn eines neuen Befehls. Wenn Sie im Terminal auf drücken Enter, werden Sie aufgefordert, einen neuen Befehl auszuführen. Es muss also eine neue Zeile "maskiert" werden. Durch Eingabe von \gefolgt von Enterkönnen Sie den aktuellen Befehl in mehrere Zeilen aufteilen, sodass die Shell nicht den Eindruck hat, dass es sich um einen neuen Befehl handelt, sondern die Fortsetzung des vorherigen Befehls.

> ist nichts anderes als eine Eingabeaufforderung für die nächste Zeile des eingegebenen Befehls.

Zum Beispiel:
Wenn wir mehrere Pakete installieren möchten, sieht der Befehl so aus

$ sudo apt install [package1] [package2] [package3] ...

Aber manchmal macht das den Befehl unübersichtlich. So können wir \gefolgt von Enter(Newline-Zeichen) verwenden

$ sudo apt install [package1]\
> [package2]\
> [package3]\
> ...
Kulfy
quelle
4
@Curiouskangaroo BTW, können Sie steuern , wie die neuen Befehl und Zeilenfortsetzungseingabeaufforderungen zu umgehen, indem Werte der Einstellung , und Variablen. Informationen zum Format und zur Anzeige der aktuellen Einstellung finden Sie auf der bash-Manpage . $PS1$PS2echo "'$PS2'"
Jpaugh
14

Das Backslash-Zeichen ( \) wird in der Shell als Escape-Zeichen verwendet . Wenn Sie es als letztes Zeichen in der Zeile verwenden, wird es aus der neuen Zeile entfernt, sodass Sie Ihren Befehl in der nächsten Zeile fortsetzen können, anstatt ihn zu beenden. Dies wird durch die >Eingabeaufforderung in Bash angezeigt .

Beispiel:

$ echo A\
> B
AB
$

Um \Ihrem Befehl ein Literal hinzuzufügen, müssen Sie es mit einem anderen Backslash umgehen:

$ echo \\
\
$
Melebius
quelle
7

[Hinzufügen einer (zu langen / komplexen) Antwort, da die anderen 2 nicht erwähnen, wie das ">" erscheint ... dh PS2 nicht erwähnen]

Sie haben eingegeben: \Enter: die \sagt zu der Schale nur Ausgang der Enterals literral Charakter statt sie wie üblich zu interpretieren (daher die Schale „geht in die nächste Zeile“ statt der aktuellen Befehlszeile endet und es zu interpretieren Wenn Sie in ein paar sind. andere Konstrukte wie ein Heredoc, eine for-Schleife usw.).

Ihr Terminal interpretiert daher \Enterwie folgt: "Gehe zur nächsten Zeile" (ohne den Befehl zu interpretieren) und das Terminal lässt Sie nun die 2. Zeile eines mehrzeiligen Befehls eingeben und zur besseren Sichtbarkeit den $PS2Inhalt anzeigen ( die angerufene PS2 prompt ) an jeder nachfolgenden Zeile.

Die PS2- Variable ist normalerweise standardmäßig definiert als: PS2="> "und Sie können zum Beispiel Ihre ~ / .bashrc-Datei bearbeiten , um sie nach Belieben neu zu definieren (wobei zu berücksichtigen ist, dass sie gefährliche Zeichen wie >oder vermeiden ;sollte und Ihnen helfen sollte entweder deutlich sehen , es ist ein mehrzeiliges Befehl ist aber deaktivieren es mehrzeilige Inhalt (zB: PS2="#cont#") oder lassen Sie ganz einfach kopieren / einfügen sie mit so wenig Einfluss auf den Linien wie möglich (zB: PS2=" ")

Dies ist im Übrigen eine schlechte Voreinstellung, da es in einigen Fällen sehr gut dazu führen kann, dass wichtige Binärbefehle gelöscht werden.

Sie können PS2 neu definieren, um etwas anderes zu sein (ich mag: PS2 = "", zum Beispiel), so dass mehrzeilige Befehle einfach kopiert / eingefügt werden können, ohne Folgendes zu befürchten:

Nehmen wir zum Beispiel an, Sie haben einen Befehl, der ziemlich lang ist (und möglicherweise auf dem Bildschirm ausgeblendet wird, wenn Ihr Terminal nicht breit genug ist):

grep -i "something"  /some/file  /another/file /3rd/file /etc/someimportantfile 

Wenn der Befehl zu lang aussieht (und umbrochen wird), können Sie ihn visuell in zwei Zeilen aufteilen, indem Sie auswählen, wo (wann) Sie zur nächsten Zeile wechseln möchten, indem Sie Folgendes einfügen: \Enteran der entsprechenden Stelle:

grep -i "something"  /some/file  /another/file /3rd/file \
> /etc/someimportantfile #warning, "> " was inserted by the shell and this changes everything !

Unter Verwendung der Standard-PS2 fügte die Shell ">" vor "/ etc / someimportantfile" hinzu. Wenn Sie also diese 2 Zeilen in ein anderes Terminal kopieren / einfügen, ist ihre Aktion völlig anders: Anstatt in 4 Dateien zu greifen, wird "grep" verwendet Geht nur in die ersten 3 Dateien und die grep- Ausgabe ersetzt den Inhalt der 4. Datei (/ etc / someimportantfile)!

Um diese (und viele andere) Probleme zu vermeiden, können Sie beispielsweise Folgendes definieren: PS2=" "Um die mehrzeiligen Befehle übersichtlicher zu gestalten und das Kopieren und Einfügen zu vereinfachen:

grep -i "something"  /some/file  /another/file /3rd/file \
  /etc/someimportantfile #now only 2 spaces were inserted, without changing the grep's actions!

Beachten Sie, dass dieses Mal / bin / somecommand einfach 2 Leerzeichen nach rechts verschoben wird und kein ">" eingefügt wurde, sodass Sie diesen 2-zeiligen Befehl sicher kopieren / einfügen können.

PS2 wird auch in "for" "while" etc-Schleifen verwendet, und wenn es als "" definiert wird, ist es für mich auch in diesen Schleifen besser.

Olivier Dulac
quelle