Das Problem liegt in der im verlinkten Artikel verwendeten Syntax. Um zu verstehen, was genau schief geht, schauen wir uns Folgendes an man wall
:
Verwendung von man wall
:
wall [file]
Wall displays the contents of file or, by default, its standard input
So wall
übernimmt entweder aus zwei Quellen für seine Botschaft.
Argument Dateiname
Jedes Kommandozeilenargument wall
muss ein Dateiname sein. Da es keine zuverlässige Möglichkeit gibt, festzustellen, ob das Argument als Nachricht oder Dateiname gedacht ist, wall
wird davon ausgegangen, dass es sich um das letztere handelt. Ignorieren Sie alle Eingaben in der Standardeingabe und versuchen Sie, die Nachricht aus dieser Datei zu lesen.
In dem gegebenen Fall versucht es, aus der Datei zu lesen who's out there
und findet sie nicht. Beachten Sie, dass das Lesen aus einer Datei normalerweise auf den Superuser beschränkt ist. Wenn Sie wall "who's out there"
als nichtprivilegierter Benutzer ausgeführt worden wären, wäre die Ausgabe wahrscheinlichwall: will not read who's out there - use stdin.
Standardeingabe
Wenn in der Befehlszeile kein Dateinamenargument angezeigt wird, beginnt der Lesevorgang mit der Standardeingabe. Es gibt verschiedene Möglichkeiten, Informationen an die Standardeingabe eines Befehls weiterzuleiten. Eine ist die Verwendung einer UNIX-Pipe . Eine Pipeline verbindet die Standardausgabe ihres Befehls auf der linken Seite mit der Standardeingabe ihres Befehls auf der rechten Seite:
$ echo "who's out there" | wall
Eine andere Möglichkeit ist die Verwendung eines Here-Dokuments . A here document
ist ein Shell-Konstrukt, das einen String (bis zu einer bestimmten Endemarkierung in einer eigenen Zeile) direkt an die Standardeingabe eines Befehls übergibt, ohne dass der Zwischenschritt, dass ein bestimmter Befehl vorhanden ist, diese Ausgabe erzeugt:
$ wall << .
who's out there?
.
Dies wäre eine "nutzlose Verwendung von Here-Dokumenten", da das Terminal standardmäßig mit der Standardeingabe des Terminals verbunden ist wall
und wall
mit dem Lesen beginnt, bis es ein Dateiende-Zeichen ( Ctrl+D) erhält :
$ wall
who's out there?
^D
Wie Rich Homolka in den Kommentaren bemerkte, unterstützen einige Shells here strings
die Übergabe einer Literalzeichenfolge ohne Befehls- oder Endemarkierungen:
$ wall <<< "who's out there?"
Alle speisen etwas in wall
die Standardeingabe ein. Der Unterschied besteht darin, dass eine Pipeline die Ausgabe eines anderen Befehls damit verbindet here documents
und here strings
die Zeichenfolge direkt übergibt. Die beiden letztgenannten Vorteile sind ästhetisch, da der echo
Befehl aus dem Pipe-Beispiel ein in die Shell integrierter Befehl ist, der wall
in allen Fällen die Eingabe der Shell bereitstellt .
echo xxx | yyy
Syntax zu umgehen , die ich schwerfällig findewall <<<'your message'
wall <<< string
Sintax angeboten haben. Das ist ziemlich gut. Kann einer von euch erklären, was<<<
genau passiert (und warum es effizienter ist, wie peth sagte)? Ich finde es seltsam, dass ein cmd, der eine Datei benötigt, einen String danach akzeptieren kann<<<
. Danke noch einmal.wall
sie akzeptiert (Wand liest von stdin , wenn Sie don‘ t eine Datei angeben). Um zu überprüfen, ob Herestrings eine Datei erstellen,$ readlink /proc/self/fd/0 <<< test
wird so etwas wie gedruckt/tmp/sh-thd-4228536315 (deleted)
.versuche es mit root
Wenn sich Ihre Datei im Ausgangsverzeichnis befindet, versuchen Sie es mit einem anderen Pfad
quelle