ファイルから来たように文字をコマンドに送信するにはどうすればよいですか?


22

ファイルから来たように文字をコマンドに送信するにはどうすればよいですか?

たとえば、私が試した:

wc < "apple pear orange"
-bash: apple pear orange: No such file or directory

回答:



18

他の2つのアプローチ(追加の労力なしで複数行の入力を許可):

  1. 「hereドキュメント」を使用します。

    $ wc << EOF
    リンゴ梨オレンジ
    EOF
      1 3 18
    $

    EOF文字列が区切り文字です。任意の文字列を使用できます。EOF単なる従来の選択です。

  2. 入力としてttyを使用します。

    $ wc
    リンゴ梨オレンジ
    Ctrl+D
      1 3 18
    $

    これには、プログラムが実行を開始し、名前を入力するとすぐに入力の読み取りを開始するという欠点があります。これは戸惑う可能性があります。例えば:

    $ grep v
    素早い茶色のキツネ              (型付き)が 
    飛び越え                       (型付き) 
    飛び越え                       (これはgrepからの出力です!) 
    怠dogな犬。                   (入力済み)
    Ctrl + D
                                    (ここに出力なし) 
    $

レコードの場合:-enclosed文字列には改行を含めることができる<<<ため、"フォームは余分な労力なしで複数行の入力も許可します。もちろん、<< EOFフォーム(元のhere-doc構文)は、複数行の入力がある場合に読みやすくなります。
アレクシス

マニュアルページには、ここでの文字列構文は<<< word、もちろん、シェルのコンテキストでは、wordスペースと改行を含む引用符付き文字列であることができると書かれています!ど!それは言うまでもないことです(そして、実際、manページにはまったく言及されていません)。:-(私にこれを指摘してくれてありがとう!
G-マンは「元に戻すモニカ言う

私はそれを単純または明白とは言いません、本当に。A wordはマンページで「シェルによって単一のユニットと見なされる文字のシーケンス」(別名「トークン」)として定義されており、引用された文字列は関連する意味で「単一のユニット」として扱われることを知っておく必要があります(後に確かにバックスラッシュ処理、変数の展開など、」しかし、シェルに二重引用符の全体の目的です(単一引用符も展開から保護する。)、シェルの処理モデルは非常によく考え抜かれ、何もなく、シンプルさ。。
アレクシス

@alexis:私がそのようにトップに行き、顔文字含めるとき、人は私が皮肉である可能性を考慮すべきです。
G-Manが「Reinstate Monica」と言う

10

ここにはいくつかの有効な解決策がありますが、時には役立つ別の構文は、でコマンドを実行することです<()。これにより、コマンドラインで複数のファイル記述子オブジェクトを作成できます。

これは、テキストの長い文字列を比較するようなことをしているとき、またはファイルにないコンテンツを比較したいときに便利です。

たとえば、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の引数を指定することで、標準入力からその入力のを-両方ではありません。
dave_thompson_085

これはサポートされていないプロセス置換であり、あなたが主張している部分とは異なり、サポートされていません(ただし、daveの説明どおりではありません)。
phk

1
私のdiffはUbuntu 16.04のbashと、テストする必要のあるSolaris 11.2システムで正常に動作します。すべてのオペレーティングシステム上のすべてのシェルで動作しない可能性があります。実際には、ファイルを読み取っているかのようにサブプロセスから出力を読み取るために使用できるファイル記述子を作成しています。diffは2つのファイル引数を取るため、作成されたファイル記述子を介して両方のサブプロセスの出力を読み取り、それらを比較できます。
ティムケネディ

cmd <(cmd2 ...)との違いを回答に追加できますcmd < <(cmd2 ...)。前者では、ファイル名の代わりに派生データ(cmd2の出力)を使用できます。後者はと同等cmd2 ... | cmdです。コマンドは、stdin入力を明示的に受け入れるように作成する必要があり、多くはそうではありません。これは特にシェルスクリプトに当てはまります。
DocSalvager

8

パイプを使用できます

echo "apple pear orange" | wc

8
パイプは「ファイルから読み取る」と同じではありません。たとえば、パイプでは逆方向にシークできませんが、ファイルでは逆シークできます。
-rbialon

0

予想と同様のものを使用することもできます。次に、リモートtelnetセッションを開き、プロンプトを待機し、データを送信し、応答を待機し、スリープして終了する簡単な例を示します。

#!/usr/bin/expect
spawn telnet localhost 8555
expect "Escape character is '^]'."
send "Hello World\n"
expect "Connection closed by foreign host."
sleep 1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.