問題は、リンクされた記事で使用されている構文にあります。正確に何が問題なのかを理解するために、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 documents
と here strings
文字列を直接渡します。 echo
のように、後者の 2 つの利点は審美的なものです。 パイプの例のコマンドはシェルの組み込みコマンドなので、wall
を提供するシェルになります。