回答:
他の2つのアプローチ(追加の労力なしで複数行の入力を許可):
「hereドキュメント」を使用します。
$ wc << EOF リンゴ梨オレンジ EOF 1 3 18 $
EOF文字列が区切り文字です。任意の文字列を使用できます。EOF単なる従来の選択です。
入力としてttyを使用します。
$ wc リンゴ梨オレンジ Ctrl+D 1 3 18 $
これには、プログラムが実行を開始し、名前を入力するとすぐに入力の読み取りを開始するという欠点があります。これは戸惑う可能性があります。例えば:
$ grep v 素早い茶色のキツネ (型付き)が 飛び越え (型付き) 飛び越え (これはgrepからの出力です!) 怠dogな犬。 (入力済み) Ctrl + D (ここに出力なし) $
<<<ため、"フォームは余分な労力なしで複数行の入力も許可します。もちろん、<< EOFフォーム(元のhere-doc構文)は、複数行の入力がある場合に読みやすくなります。
<<< word、もちろん、シェルのコンテキストでは、wordスペースと改行を含む引用符付き文字列であることができると書かれています!ど!それは言うまでもないことです(そして、実際、manページにはまったく言及されていません)。:-(私にこれを指摘してくれてありがとう!
wordはマンページで「シェルによって単一のユニットと見なされる文字のシーケンス」(別名「トークン」)として定義されており、引用された文字列は関連する意味で「単一のユニット」として扱われることを知っておく必要があります(後に確かにバックスラッシュ処理、変数の展開など、」しかし、シェルに二重引用符の全体の目的です(単一引用符も展開から保護する。)、シェルの処理モデルは非常によく考え抜かれ、何もなく、シンプルさ。。
ここにはいくつかの有効な解決策がありますが、時には役立つ別の構文は、でコマンドを実行することです<()。これにより、コマンドラインで複数のファイル記述子オブジェクトを作成できます。
これは、テキストの長い文字列を比較するようなことをしているとき、またはファイルにないコンテンツを比較したいときに便利です。
たとえば、hostsファイルをlocalhostにコピーせずに、2つのノード上のhostsファイルを比較します。
diff -Naur <(cat /etc/hosts) <(ssh -q otherhost 'cat /etc/hosts')
<STDINにファイルをリダイレクトして、()括弧の間にコマンドを実行するためのサブシェルを作成します。実行されているコマンドのSTDINに渡されるのは、サブシェルからのSTDOUTです。
ここで複数のドキュメントを使用したり、複数のコマンドをパイプラインにエコーして最終コマンドにしたりするよりも、コマンドに複数の入力「ファイル」を作成する方が簡単です。
<fileorpathnamestdinをリダイレクト<(subcmd)しますが、リダイレクトしません。これは、プログラムによって開かれた場合または開かれた場合にsubcmdからstdoutを読み取ることができる名前に置き換えます。< <(subcmd)(必要なスペース)は、ほとんどのように、そのファイルからstdinをリダイレクトしますsubcmd |。あなたのdiff読むことができる1の引数を指定することで、標準入力からその入力のを-両方ではありません。
cmd <(cmd2 ...)との違いを回答に追加できますcmd < <(cmd2 ...)。前者では、ファイル名の代わりに派生データ(cmd2の出力)を使用できます。後者はと同等cmd2 ... | cmdです。コマンドは、stdin入力を明示的に受け入れるように作成する必要があり、多くはそうではありません。これは特にシェルスクリプトに当てはまります。