Warum sendet der Linux-Befehl wall kein String-Argument?

13

Ich habe hier gelesen , dass dies funktionieren sollte, aber es funktioniert nicht:

# usage: wall [file]
root@sys:~> mesg
is y

root@sys:~> wall "who's out there"
wall: can't read who's out there.

Wenn auf mesggesetzt y, was hindert mich daran, einen String zu senden? Beachten Sie , ich habe bestätigen , dass die Datei Option funktioniert:

root@sys:~> wall test
Broadcast Message from root@sys (/dev/pts/1) at 15:23 ... 
Who's out there?
mbb
quelle

Antworten:

21

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 .

peth
quelle
1
Bash / zsh hat ein anderes Format, um die echo xxx | yyySyntax zu umgehen , die ich schwerfällig findewall <<<'your message'
Rich Homolka
Ich bin mir bei diesem Rich nicht sicher - die Syntax von wall sollte nicht von der Shell abhängen, es sei denn, es gibt ein .bashrc oder was auch immer das zsh-Äquivalent ist. Ich benutze auch Bash.
mbb
Danke, Peth - das ist die syntaktische Organisation, die ich lernen musste!
mbb
Mein Fehler Rich! Mit Peths Klarstellung sehe ich jetzt, dass Sie die wall <<< stringSintax 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.
mbb
1
@mjb Es ist eigentlich unwahrscheinlich , dass die herestring ist effizienter als Echo - herestrings Arbeit durch eine temporäre Datei zu machen, und dann Anbringen dass als eines Prozesses stdin (Dateideskriptor 0), weshalb wallsie 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 <<< testwird so etwas wie gedruckt /tmp/sh-thd-4228536315 (deleted).
Stuart P. Bentley
0

versuche es mit root

root@username:~# wall /home/username/yourfile_name 

Wenn sich Ihre Datei im Ausgangsverzeichnis befindet, versuchen Sie es mit einem anderen Pfad

mohamadali abasnejad
quelle