Tatsächlich fordert die Shell einen vollständigen Befehl / Ausdruck an und zeigt aus diesem Grund die PS2
Eingabeaufforderungszeichenfolge 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 PS1
Eingabeaufforderung ist Ihre root@sai:~#
Zeichenfolge, die normalerweise angezeigt wird , wenn Sie Befehle eingeben. >
ist die PS2
Eingabeaufforderung. Es gibt auch andere: PS3
zum select
Befehlsblockieren und PS4
zum Debuggen mit set -x
Befehl. In diesem Fall interessieren wir uns mehr PS2
.
Es gibt viele Möglichkeiten, wie die Shell die PS2
Eingabeaufforderung anzeigen kann (und wo das Ausführen eines Befehls in einer neuen Zeile erforderlich sein kann). Dieselbe Eingabeaufforderung wird verwendet, wenn Sie eine here-doc
Umleitung 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
), ksh
und mksh
. csh
und seine Derivate verhalten sich nicht so:
$ tcsh
eagle:~> '
Unmatched '.
eagle:~> csh
% '
Unmatched '.
%
csh
Wird 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: