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

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

私はUbuntu Linuxを使用しています。プログラムmyprogramがユーザーに具体的に入力するように求められ、メッセージが表示されたら、ユーザーは整数を入力する必要がありますEnter。 Bashスクリプトを使用してこのプロセスを自動化したいと思います。特に100回実行したいです(〜のカウンターを使用myprogram)。実行するたびにメッセージが表示されたら、現在の値を入力したいと思います。 i1100myprogrami

(ところで、myprogramoptions / switchesを使用すると、-optionsこれらはすべて定数であるため、bashスクリプトで指定されます。)

このbashスクリプトの不完全なスケルトンは次のとおりです。

#!/bin/bash
for i in {1..100}
do
   myprogram -options
done

iこれで、プログラムでメッセージが表示されたときに現在の値を入力するように上記のコードを変更したいと思います。これを行う最良の方法は何ですか?

私が使用しているソフトウェアのウェブサイトをお勧めします<<EOF行の終わりに使用されますmyprogram -options。私はこれがbashに使用する入力のために「ファイルの終わり」を見るように指示すると思います。しかし、入力を入れないようにするには終わりファイル? orの直後に入れるには<<どうすればいいですか<

その理由は状況がさらに複雑になるからだ。たとえば、j非線形、非順次的な方法で変更される整数カウンタを導入できます。その後、各反復ごとに現在のtoの値を指定したいのですが、j呼び出しとファイルの終わりの間でmyprogram値が変更されることがあります。jmyprogram -optionsEOF

おすすめメニューとは何ですか?

答え1

ほとんどすべてのプログラムで動作するecho $i | myprogram -options必要があり、myprogram -options <<<$i標準入力を介してプログラムを提供してください$i

<foostdinというファイルの内容が使用されますfoo

<<fooこのテキストと でのみ構成される行の間のテキストは、foo標準入力として使用されます。これはここのドキュメント(heredoc) Gilesが言ったように、EOF実際にはファイルの終わりを意味するのではなく、単に一般的な区切り文字記述子にすぎません(この場合は代わりに「foo」を使用します)。

<<<foo標準入力として文字列「foo」を使用します。$foo上記のように変数を指定することもでき、シェルはその内容を標準入力として使用します。これは…ここに文字列これは、区切り文書のようにブロック全体の代わりに短い文字列を使用するためです。 Herestringはbashでは動作しますが/bin/sh

答え2

サイトで推奨される構文は次のとおりです。ここのドキュメント。ファイルプログラムへの入力は、埋め込み行の直下で始まり、<<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

答え3

上記のKevinやGilesなどのファイルや単純なパイプは、多くの場合に機能します。

より複雑な場合は、Expectや同様のモジュールを見てください(例:Expect :: Simple CPANモジュールは使いやすいPerl実装です)。個人的には私はperlモジュールを好みます(期待自体はtclです)、一般的なスクリプト言語の実装はたくさんあります。一つでも書くことができます。非常にwhileとreadを使用してshまたはbashでこのアイデアをデフォルトで実装します。

Expectおよび同様のツールの一般的なアイデアは、プログラム出力で指定された文字列またはパターンを待ってから、必要な入力を提供することです。

一般的な使用例は、「ogin:」文字列を「期待」(つまり待機)し、ログイン名を送信してから、「word:」文字列を予想してパスワードを送信する方法でログインを自動化することです。

myprogramのソースコードがある場合、最後のオプションはそれを修正してコマンドラインオプションとして提供したい入力を取得することです。これには、より多くの事前作業が必要になる可能性がありますが、Expectを操作したり、この方法で使用するように設計されていないプログラムにデータを転送するよりもはるかに簡単です。

...そしてパッチをmyprogramの上流に提出することを忘れないでください:) コーディング方式が気に入らなくても、機能自体を追加するほどアイデアが好きかもしれません。上流の開発者は、要求または文句を言う人よりも努力し、貢献する人を高く評価する傾向があります。

関連情報