GNU/Linux >> Linux の 問題 >  >> Linux

EOF を使用せずに bash スクリプトからのテキスト入力を自動化する

ほぼすべてのプログラムで、両方 echo $i | myprogram -optionsmyprogram -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 に送信することを忘れないでください :) コーディングした方法が気に入らなくても、機能を自分で追加するのに十分なアイデアが気に入るかもしれません。上流の開発者は、要求したり文句を言ったりするよりも、自分の尻から降りて貢献してくれる人を高く評価する傾向があります。


Linux
  1. Bashスクリプトでクリップボードとの間でパイプする

  2. bash スクリプトを使用した telnet セッションの自動化

  3. スクリプトの実行が完了するのを待たずに、別のスクリプトから bash スクリプトを実行しますか?

  1. アトミック作成ファイルが存在しない場合は、bash スクリプトから

  2. bashスクリプトでlftpを使用してファイルを転送する

  3. ~/.bashrc を bash コマンドを使わずに復元する

  1. bashスクリプトが同時に実行されないようにする

  2. Bashスクリプト内からフルパスを取得しますか?

  3. Rsync〜/ foo Target / fooはRsync〜/ foo / Target / foo /と同じですか?