GNU/Linux >> Linux の 問題 >  >> Linux

Linux wall コマンドが文字列引数をブロードキャストしないのはなぜですか?

問題は、リンクされた記事で使用されている構文にあります。正確に何が問題なのかを理解するために、man wall を見てみましょう。 :

man wallからの使用 :

wall [file]

Wall displays the contents of file or, by default, its standard input

だから wall どちらかを受け入れます そのメッセージの 2 つのソースの。

ファイル名引数

wall に与えられた任意のコマンド ライン引数 ファイル名でなければなりません。引数がメッセージまたはファイル名を意味するかどうかを判断する信頼できる方法がないため、 wall 後者であると想定し、標準入力から入ってくるものを無視し、そのファイルからメッセージを読み取ろうとします。

この場合、ファイル who's out there から読み取ろうとします。 そして見つからない。通常、ファイルからの読み取りはスーパーユーザーに制限されていることに注意してください。 wall "who's out there" を実行した場合 特権のないユーザーとして、おそらくその出力は wall: will not read who's out there - use stdin. だったでしょう

標準入力

コマンドラインでファイル名の引数を取得しない場合、標準入力から読み取りを開始します。コマンドの標準入力に情報を供給する方法はいくつかあります。 1 つは UNIX パイプを使用することです。パイプラインは、左側のコマンドの標準出力を右側のコマンドの標準入力に接続します:

$ echo "who's out there" | wall

もう 1 つの方法は、ヒア ドキュメントを使用することです。 here document は、文字列 (それ自体の行の指定されたエンド マーカーまで) をコマンドの標準入力に直接渡すシェル コンストラクトです。別のコマンドがその出力を生成する中間ステップはありません。

$ wall << .
who's out there?
.

デフォルトでは端末自体が wall に接続されるため、これは「ヒアドキュメントの無駄な使用」になります。 の標準入力と wall ファイル終了文字 (Ctrl+D) を受け取るまで、そこから読み取りを開始します。 ):

$ wall
who's out there?
^D

Rich Homolka がコメントで指摘したように、一部のシェルは here strings をサポートしています コマンドまたは終了マーカーなしでリテラル文字列を渡すことができます:

$ wall <<< "who's out there?"

すべてが wall に何かを供給します の標準入力です。違いは、パイプラインが別のコマンドの出力をそれに接続することですが、here documentshere strings 文字列を直接渡します。 echo のように、後者の 2 つの利点は審美的なものです。 パイプの例のコマンドはシェルの組み込みコマンドなので、wall を提供するシェルになります。


Linux
  1. Linuxgrepコマンドの使用方法

  2. Linuxでhistoryコマンドを使用する方法

  3. Linuxlsコマンドをマスターする

  1. Linuxコマンドラインに関する8つのヒント

  2. Linuxでのddコマンドの5つの実用例

  3. Linux での locate コマンド

  1. Linuxでwallコマンドを使用する方法

  2. Linuxでのalternativesコマンドの概要

  3. Linux のごみ箱コマンドを元に戻す