echo "yes" | my_program < input_file
Ambiguous input redirect
cshでエラーが発生しました。この問題を解決するには?
答え1
opが残したコメントによっては、my_program
質問に対する回答が必要な場合がありますyes|no
。
expect
これは、オペレータが予想されるマニュアルページで作業に適したツールを使用したいことを意味します。
Expectは、スクリプトに基づいて他のインタラクティブプログラムと「会話」するプログラムです。スクリプトによって、Expectはプログラムが期待できるものと正しい応答が何であるかを知っています。通訳言語は、会話を導くための分岐と高レベルの制御構造を提供します。また、ユーザーは必要に応じて直接制御して対話し、コントロールをスクリプトに返すこともできます。
これで、オペレーティングプログラムのプロンプトが何であるかわかりませんが、次Are you sure
から始めるとします。
#!/usr/bin/expect
spawn bash -c "my_program < /tmp/input"
expect {
"Are you sure" {
send "yes"
}
eof
}
上記のようにシェルスクリプトを生成し、実行したいコマンドの代わりに実行するだけです。
「プログラム」、「入力ファイル」、「質問」、「あなたの回答」(最後の2つはオプションです。「質問」が表示されない場合は送信されません。になります。)
#!/usr/bin/expect
set arg1 [lindex $argv 0]
set arg2 [lindex $argv 1]
set arg3 [lindex $argv 2]
set arg4 [lindex $argv 3]
spawn bash -c "$arg1 < $arg2"
expect {
"$arg3" {
send "$arg4"
}
eof
}
以下を使用してください(上記の内容をにコピーしたとしますmyexp.sh
)。
./myexp.sh "my_program" "/tmp/input" "yes"
通常、複数の入力ソースが必要な場合は、ここでドキュメントを使用して並べ替えることができます。
my_program <<EOF
`cat input_file`
yes
EOF
複数入力用の別のオプション:
echo 'yes' >> input_file
または一時ファイルを使用してください。
echo 'yes' > /tmp/myfile$$.txt
cat input_file >> /tmp/myfile$$.txt
my_program < /tmp/myfile$$.txt
それはすべてあなたが達成したいものに依存します。
編集(コメントから):
( echo 'yes'; cat input_file;) | my_program
また、動作します...ここで文書を見つけました。簡単に読んでください、YMMV。
答え2
問題は、echo
標準出力をmy_program
標準入力に接続することです。
echo "yes" | my_program
...そして同時にあなたも返品input_file
標準入力に内容を入力しますmy_program
。
my_program < input_file
プロセス(この場合my_program
)は2つの異なるソースからstdinを取得できないため、入力を提供するプロセスを選択する必要があります。