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 wallmuss ein Dateiname sein. Da es keine zuverlässige Möglichkeit gibt, festzustellen, ob das Argument als Nachricht oder Dateiname gedacht ist, wallwird 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 thereund 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 documentist 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 wallund wallmit 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 stringsdie Übergabe einer Literalzeichenfolge ohne Befehls- oder Endemarkierungen:
$ wall <<< "who's out there?"
Alle speisen etwas in walldie Standardeingabe ein. Der Unterschied besteht darin, dass eine Pipeline die Ausgabe eines anderen Befehls damit verbindet here documentsund here stringsdie Zeichenfolge direkt übergibt. Die beiden letztgenannten Vorteile sind ästhetisch, da der echoBefehl aus dem Pipe-Beispiel ein in die Shell integrierter Befehl ist, der wallin allen Fällen die Eingabe der Shell bereitstellt .
echo xxx | yyySyntax zu umgehen , die ich schwerfällig findewall <<<'your message'