Das Problem liegt in der im verlinkten Artikel verwendeten Syntax. Um zu verstehen, was genau schief läuft, werfen wir einen Blick auf man wall
:
Verwendung ab man wall
:
wall [file]
Wall displays the contents of file or, by default, its standard input
Also wall
akzeptiert beides von zwei Quellen für seine Botschaft.
Dateinamenargument
Jedes Befehlszeilenargument, das an wall
übergeben wird muss ein Dateiname sein. Da es keinen zuverlässigen Weg gibt, um festzustellen, ob das Argument als Nachrichten- oder Dateiname gemeint ist, wall
nimmt an, dass es letzteres ist, ignoriert alles, was über die Standardeingabe kommt, und versucht, die Nachricht aus dieser Datei zu lesen.
Im gegebenen Fall wird versucht, aus der Datei who's out there
zu lesen und findet es nicht. Beachten Sie, dass das Lesen aus einer Datei normalerweise auf den Superuser beschränkt ist. Wenn Sie wall "who's out there"
ausgeführt hätten Als unprivilegierter Benutzer wäre die Ausgabe wahrscheinlich wall: will not read who's out there - use stdin.
gewesen
Standardeingabe
Wenn es kein Dateinamenargument auf seiner Befehlszeile erhält, beginnt es mit dem Lesen von der Standardeingabe. Es gibt mehrere Möglichkeiten, Informationen in die Standardeingabe eines Befehls einzugeben. Eine besteht darin, eine UNIX-Pipe zu verwenden. Eine Pipeline verbindet die Standardausgabe ihres linken Befehls mit der Standardeingabe ihres rechten Befehls:
$ echo "who's out there" | wall
Eine andere Möglichkeit ist die Verwendung eines Here-Dokuments. Ein here document
ist ein Shell-Konstrukt, das einen String (bis zu einer bestimmten Endmarkierung in einer eigenen Zeile) direkt an die Standardeingabe eines Befehls übergibt, ohne dass ein bestimmter Befehl diese Ausgabe erzeugen muss:
$ wall << .
who's out there?
.
Dies wäre eine "unnütze Verwendung dieser Dokumente", da das Terminal selbst standardmäßig mit wall
verbunden wird Standardeingabe und wall
beginnt von dort zu lesen, bis es ein Dateiendezeichen empfängt (Strg+D ):
$ wall
who's out there?
^D
Wie Rich Homolka in den Kommentaren bemerkte, unterstützen einige Shells here strings
die es ermöglichen, eine wörtliche Zeichenfolge ohne Befehls- oder Endmarkierungen zu übergeben:
$ wall <<< "who's out there?"
Alle geben etwas an wall
weiter die Standardeingabe von . Der Unterschied besteht darin, dass eine Pipeline die Ausgabe eines anderen Befehls damit verbindet, während here documents
und here strings
Übergeben Sie die Zeichenfolge direkt. Der Vorteil der letzteren beiden ist hier ein ästhetischer, wie der echo
Der Befehl aus dem Pipe-Beispiel ist ein Shell-integrierter Befehl, also wird es die Shell sein, die wall
bereitstellt 's Eingabe in allen Fällen.