ほぼすべてのプログラムで、両方 echo $i | myprogram -options
と myprogram -options <<<$i
プログラム $i
をフィードすることで動作するはずです 標準入力から。
<foo
foo
という名前のファイルの内容を使用します 標準入力として。
<<foo
それと foo
だけで構成される行の間のテキストを使用します 標準入力として。これはヒアドキュメントです (ヒアドキュメント)、ジルが言ったように。 EOF
は実際にはファイルの終わりを意味するのではなく、一般的なヒアドキュメント区切り記号です (この例では代わりに「foo」を使用しています)。
<<<foo
文字列 "foo" を標準入力として使用します。変数 $foo
を指定することもできます 上で示したように、シェルはその内容を stdin として使用します。これはヒアストリングと呼ばれます 、ヒアドキュメントのようにブロック全体とは対照的に短い文字列を使用するためです。ヒアストリングスは bash では機能しますが、/bin/sh
では機能しません .
この Web サイトで推奨される構文は、ヒア ドキュメントと呼ばれます。ファイル プログラムへの入力は、<<EOF
を含む行のすぐ下から始まります。 、スクリプトの終わりではなく、テキスト EOF
を正確に含む行で終了します (余分な空白を入れないように注意してください)。ちなみに、シェルの特殊文字 EOF
を含まない任意の終了マーカーを使用できます。 はキーワードではなく、単に伝統的なものです。
#!/bin/bash
for i in {1..100}
do
myprogram -options <<EOF
$i
EOF
for j in {1..42}; do
myprogram2 <<EOF
$i
$j
EOF
done
done
上記の Kevin と Gilles の両方が言及した here ドキュメント、または単純なパイプで多くの場合に機能します。
より複雑な状況については、Expect などを検討することをお勧めします (たとえば、Expect::Simple CPAN モジュールは非常に使いやすい perl 実装です)。個人的には、perl モジュール (Expect 自体は tcl) を好みますが、多くの一般的なスクリプト言語の実装があります。 very を書くことさえ可能です。 while と read を使用した sh または bash でのアイデアの基本的な実装。
Expect および同様のツールの一般的な考え方は、プログラムの出力で指定された文字列またはパターンを待機し、必要な入力を与えることです。
一般的な使用例は、文字列 "ogin:" を "期待" (つまり、待機) してログインを自動化し、ログイン名を送信し、文字列 "word:" を期待してパスワードを送信することです。
myprogram のソースがある場合の最後のオプションの 1 つは、それを変更して、コマンド ライン オプションとして与えたい入力を取得することです。これは前もっての作業が少し増えるかもしれませんが、Expect をいじったり、そのように使用するように設計されていないプログラムにデータをパイプしたりするよりは、問題が大幅に軽減されます。
... そしてパッチをアップストリームの myprogram に送信することを忘れないでください :) コーディングした方法が気に入らなくても、機能を自分で追加するのに十分なアイデアが気に入るかもしれません。上流の開発者は、要求したり文句を言ったりするよりも、自分の尻から降りて貢献してくれる人を高く評価する傾向があります。