In welchen Modus wechselt das Terminal, wenn ich ein einfaches Anführungszeichen eingebe?


11

Wenn ich 'im Terminal ein einfaches Anführungszeichen eingebe, wechselt es in einen anderen Modus, und Befehle werden nicht ausgeführt. Was ist dieser Modus und wann verwenden wir ihn?

root@sai:~# '
> ls
> '
ls
: command not found
root@sai:~#

30
und warum rennst du als root?
Zanna

13
Ihr Terminal befindet sich im selben Modus wie zuvor - Ihre Shell befindet sich in einem anderen Modus (wartet auf die Vervollständigung eines Strings mit einem anderen ')
ohno

Antworten:


26

Tatsächlich fordert die Shell einen vollständigen Befehl / Ausdruck an und zeigt aus diesem Grund die PS2Eingabeaufforderungszeichenfolge an.

Von man bash:

PROMPTING

Bei der interaktiven Ausführung zeigt bash die primäre Eingabeaufforderung PS1 an, wenn es bereit ist, einen Befehl zu lesen, und die sekundäre Eingabeaufforderung PS2, wenn mehr Eingaben erforderlich sind, um einen Befehl auszuführen .

Und kurz davor:

  PS2    The value of this parameter is  expanded
          as  with  PS1  and used as the secondary
          prompt string.  The default is ``> ''.

Wie Sie vielleicht aus der Dokumentation ersehen können, haben Shells mehrere Eingabeaufforderungen mit unterschiedlichen Zwecken. Die PS1Eingabeaufforderung ist Ihre root@sai:~#Zeichenfolge, die normalerweise angezeigt wird , wenn Sie Befehle eingeben. >ist die PS2Eingabeaufforderung. Es gibt auch andere: PS3zum selectBefehlsblockieren und PS4zum Debuggen mit set -xBefehl. In diesem Fall interessieren wir uns mehr PS2.

Es gibt viele Möglichkeiten, wie die Shell die PS2Eingabeaufforderung anzeigen kann (und wo das Ausführen eines Befehls in einer neuen Zeile erforderlich sein kann). Dieselbe Eingabeaufforderung wird verwendet, wenn Sie eine here-docUmleitung durchführen (wobei ein Befehl als vollständig betrachtet wird, wenn in diesem Beispiel die Abschlusszeichenfolge angezeigt wird EOF):

$ cat <<EOF
> line one
> line two
> EOF
line one
line two

Sehr oft kann die Fortsetzung eines längeren Befehls durch Hinzufügen einer \sofortigen (!) Neuen Zeile erfolgen, wodurch dieselbe Eingabeaufforderung angezeigt wird:

$ echo Hello\
> World
HelloWorld

$ echo 'Hello\                                                                                                           
> World'
Hello\
World

Wenn Pipes, Logikoperatoren oder spezielle Schlüsselwörter in der Befehlszeile vor newline angezeigt werden, wird der Befehl ebenfalls als unvollständig betrachtet, bis alle endgültigen Anweisungen eingegeben wurden:

$ echo Hello World | 
> wc -l
1

$ echo Hello World &&                                                                                                    
> echo "!"
Hello World
!

$ for i in $(seq 1 3); do
> echo "$i"
> done
1
2
3 

$ if [ -f /etc/passwd ]
> then
>     echo "YES"
> fi
YES

In Ihrem speziellen Fall impliziert ein einfaches Anführungszeichen eine wörtliche Interpretation dessen, was sich zwischen den einzelnen Anführungszeichen befindet. Wie Zanna betonte, geben Sie also einen Befehl ein, der aus Zeilenumbruch + ls+ Zeilenumbruch besteht. Ein solcher ausführbarer Dateiname kann nicht gefunden werden (und normalerweise sollten Befehlsdateinamen nur aus alphanumerischen Zeichen sowie Unterstrichen, Bindestrichen und Punkten bestehen). Obwohl es tatsächlich möglich ist, Dateinamen zu enthalten, die Sonderzeichen enthalten, wird dies immer vermieden.

HINWEIS : ein solches Verhalten wie in Ihrem Beispiel gezeigt ist spezifisch für Bourne-wie Muscheln, einschließlich bash, dash(auf Ubuntu ist Symlink zu /bin/sh), kshund mksh. cshund seine Derivate verhalten sich nicht so:

$ tcsh                                                    
eagle:~> '
Unmatched '.
eagle:~> csh
% '
Unmatched '.
%  

cshWird im interaktiven Modus jedoch weiterhin ?als Eingabeaufforderung2 ausgelöst, wenn weitere Eingaben erforderlich sind:

$ csh
% foreach n ( 1 2 3 )
? echo $n
? end
1
2
3  

Siehe auch:


Der Link What's the difference between <<, <<< and < < in bash?ist offline / falsch.
Tico

@Tico Danke behoben. Die Antwort wurde mit einer Internetgeschwindigkeit von Milli-Turtles pro Sekunde geschrieben, was nur zu einem teilweise kopierten Link führte. Jetzt
behoben

3
In der Zwischenzeit ist zsh so freundlich, Ihnen tatsächlich zu sagen, worauf es wartet. Dies ist gelegentlich nützlich, wenn Sie dachten, Ihr Befehl sei gültig, aber vergessen haben, etwas zu entkommen.
Kevin

30

Die Shell wartet nur auf das Schlusszitat. Wenn Sie es eingeben, wird es genau das tun, was es normalerweise tut, und versuchen, den eingegebenen Befehl auszuführen.

Anführungszeichen bewirken, dass die Shell keine Sonderzeichen interpretiert, was bedeutet, dass keine Erweiterungen durchgeführt werden. Einfache Anführungszeichen unterdrücken die Interpretation von Sonderzeichen vollständig. Normalerweise trennt eine neue Zeile Befehle, aber hier haben Sie die neuen Zeilen als Teil des Befehls eingefügt, indem Sie sie in Anführungszeichen setzen.

Da es keinen solchen Befehl gibt <newline>ls<newline>, wird er nicht gefunden.

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.