
私はUbuntu Linuxを使用しています。プログラムmyprogram
がユーザーに具体的に入力するように求められ、メッセージが表示されたら、ユーザーは整数を入力する必要がありますEnter。 Bashスクリプトを使用してこのプロセスを自動化したいと思います。特に100回実行したいです(〜のカウンターを使用myprogram
)。実行するたびにメッセージが表示されたら、現在の値を入力したいと思います。 i
1
100
myprogram
i
(ところで、myprogram
options / 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
値が変更されることがあります。j
myprogram -options
EOF
おすすめメニューとは何ですか?
答え1
ほとんどすべてのプログラムで動作するecho $i | myprogram -options
必要があり、myprogram -options <<<$i
標準入力を介してプログラムを提供してください$i
。
<foo
stdinというファイルの内容が使用されます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の上流に提出することを忘れないでください:) コーディング方式が気に入らなくても、機能自体を追加するほどアイデアが好きかもしれません。上流の開発者は、要求または文句を言う人よりも努力し、貢献する人を高く評価する傾向があります。