GNU/Linux >> LINUX-Kenntnisse >  >> Linux

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

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.


Linux
  1. So verwenden Sie den Linux-Grep-Befehl

  2. 8 Tipps für die Linux-Kommandozeile

  3. So verwenden Sie den Verlaufsbefehl unter Linux

  4. Meistern Sie den Linux-ls-Befehl

  5. Machen Sie den Linux-Papierkorbbefehl rückgängig

Der Timer-Befehl in Linux

Der Linux-Curl-Befehl

Wesentliche Beispiele des ps-Befehls in Linux

Was ist der Kill-Befehl in Linux?

Verstehen des Zeitbefehls in Linux

Verwendung des grep-Befehls unter Linux