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


13

私はここでこれが動作するはずだと読みましたが、動作しません:

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

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

mesgがに設定されている場合y、文字列をブロードキャストできないのはなぜですか?注:ファイルオプションが機能することを確認しました。

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

回答:


21

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

使用方法man wall

wall [file]

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

そのため、メッセージの2つのソースのいずれかwall受け入れます。

ファイル名引数

与えられるコマンドライン引数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

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

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

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

$ wall
who's out there?
^D

リッチHomolkaはコメントで述べたように、一部のシェルのサポートhere stringsコマンドまたはエンドマーカーなしで文字列リテラルを渡すことができ:

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

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


1
バッシュ/ zshのは避けるように別の形式を持っているecho xxx | yyy私はcludgy見つける構文、wall <<<'your message'
リッチHomolka

Richの1つについてはわかりません。wallの構文は、.bashrcまたは同等のzshがない限り、シェルに基づいてはいけません。私もbashを使用します。
mbb

pethに感謝します-それは私が学ぶために必要な構文上の組織です!
mbb

私の間違いリッチ!ペスの説明で、あなたはシンタックスを申し出ていたことがわかりましたwall <<< string。それはかなり素晴らしいです。どちらが<<<正確に何をしているのかを説明できますか(そして、なぜpethが言ったようにそれがより効率的だろうか)ファイルを必要とするcmdがの後に文字列を受け入れることができるのは奇妙だと思います<<<。再度、感謝します。
mbb

1
@mjbそれはherestringエコーよりも効率的であることを、実際にそうだ-取り付け後、一時ファイルを作成し、によってherestrings仕事をその理由は、プロセスの標準入力(ファイルディスクリプタ0)、などwallの壁は、あなたが「ドン場合は標準入力から読み込み、(それを受け入れますtファイルを指定します)。herestringsがファイルを作成することを確認する方法として、のよう$ readlink /proc/self/fd/0 <<< testなものを印刷します/tmp/sh-thd-4228536315 (deleted)
スチュアートP.ベントレー14

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.