bashスクリプトにインタラクティブなプロンプトに答えさせる[重複]


109

通常はデフォルトのアクションでユーザーに表示されるプロンプトをbashスクリプトで自動的に処理することは可能ですか?現在、bashスクリプトを使用して、ユーザーにプロンプ​​トを表示する(Y / Nを要求する)社内ツールを呼び出してアクションを完了するようにしていますが、作成しているスクリプトは完全に「ハンドオフ」である必要があるため、Y|Nプログラムが実行を継続できるように、プロンプトに送信する方法が必要です。これは可能ですか?


これは「オートコンプリート」ではありません... @unwindが言うように、それは「オートメーション」です
ベンザイタ

3
使用例yesこれを行うには:unix.stackexchange.com/questions/47344/...
Droogans

回答:


65

これは「自動補完」ではなく、自動化です。これらの一般的なツールの1つがExpectです。

また、からの入力をパイプ処理するだけで済む場合もありますyes


3
残念ながら、これを実行しているシステムではスペース要件が厳しく、追加のパッケージを追加できないため、expectを使用することはできませんが、パイプを入れるとうまくいきましyesた。ありがとう。
TJ L

ただし、Yes | command常に機能するとは限りません。それがインストール目的だけの場合は、私が使用するの-yがより良い、好ましいオプションです。
Umesh Kaushik 2017年

169

シンプルな

echo "Y Y N N Y N Y Y N" | ./your_script

これにより、「Y」または「N」のシーケンスをスクリプトに渡すことができます。


3
を送信する必要がある場合はN、この方法を使用しますが、必要なのはYだけなので、を使用しましたyes。どちらも正しいので、2つの回答を受け入れることはできません。
TJ L

3
;)まあ、あなたが何かを送る必要がある場合、あなたは今Nそれを行うための良い方法を持っています。
ロイックFévrier

2
これは私にはうまくいきません。スペースは改行として数えられません---たとえば、 "Y N"とエコーした場合"Y N"、最初のプロンプトへの入力として文字列が与えられ、2番目のプロンプトでハングアップして完了を待ちます。スペースを改行に変更してみましたが、それも機能しませんでしたが、プロンプトにリテラル文字列が表示されました。
temporary_user_name

52
使用してみてくださいprintf 'y\ny\ny\n' | ./your_script。このようにして、予想される各エントリの改行を手動で挿入します。
マジッド2015年

8
printf '%s\n' Y Y N N Y N Y Y Nアイテム間に改行を挿入しますが、1つの大きなフォーマット文字列は必要ありません。
Charles Duffy

16

入力を送信する最良の方法は、猫とテキストファイルを使用して、必要な入力を渡すことです。

cat "input.txt" | ./Script.sh

期待どおりに動作しませんでした。これがこの質問に対する最も簡単で最良の答えです。
cloudxix

12

Yのみを送信する場合:

$> yes Y |./your_script

送信するNのみがある場合:

$> yes N |./your_script

9

私の状況では、YまたはNなしでテキストまたは空白を使用していくつかの質問に答える必要がありました。私の状況でこれを行う最善の方法は、シェルスクリプトファイルを作成することでした。私の場合、私はそれをautocomplete.shと呼びました

doctrineスキーマエクスポーターに関するいくつかの質問に答える必要があったので、ファイルは次のようになりました。

- これは単なる例です -

php vendor/bin/mysql-workbench-schema-export mysqlworkbenchfile.mwb ./doctrine << EOF
`#Export to Doctrine Annotation Format`                                     1
`#Would you like to change the setup configuration before exporting`        y
`#Log to console`                                                           y
`#Log file`                                                                 testing.log
`#Filename [%entity%.%extension%]`
`#Indentation [4]`
`#Use tabs [no]`
`#Eol delimeter (win, unix) [win]`
`#Backup existing file [yes]`
`#Add generator info as comment [yes]`
`#Skip plural name checking [no]`
`#Use logged storage [no]`
`#Sort tables and views [yes]`
`#Export only table categorized []`
`#Enhance many to many detection [yes]`
`#Skip many to many tables [yes]`
`#Bundle namespace []`
`#Entity namespace []`
`#Repository namespace []`
`#Use automatic repository [yes]`
`#Skip column with relation [no]`
`#Related var name format [%name%%related%]`
`#Nullable attribute (auto, always) [auto]`
`#Generated value strategy (auto, identity, sequence, table, none) [auto]`
`#Default cascade (persist, remove, detach, merge, all, refresh, ) [no]`
`#Use annotation prefix [ORM\]`
`#Skip getter and setter [no]`
`#Generate entity serialization [yes]`
`#Generate extendable entity [no]`                                          y
`#Quote identifier strategy (auto, always, none) [auto]`
`#Extends class []`
`#Property typehint [no]`
EOF

この戦略について私が好きなことは、あなたの答えが何であるかをコメントすることができ、EOFを使用すると空白行がそれだけです(デフォルトの答え)。このエクスポーターツールには、これらの質問に答えるための独自のJSON対応ツールがあるという方法で判明しましたが、これを実行した後、私はそれを理解しました=)。

スクリプトを実行するには、単に目的のディレクトリにあり'sh autocomplete.sh'、ターミナルで実行します。

つまり、<< EOL&EOF をReturn Lines組み合わせて使用することで、必要に応じてプロンプトの各質問に答えることができます。 それぞれの新しい行は新しい答えです。

私の例は、 `文字も使用してコメントでこれを行う方法を示しているので、各ステップを覚えています。

この方法の他の利点は、YまたはNだけで答えることができないことに注意してください。実際、空白で答えることができます。

これが誰かを助けることを願っています。


4

これには特別な組み込みユーティリティがあります-'yes '。

同じ答えですべての質問に答えるために、あなたは走ることができます

yes [answer] |./your_script

または、スクリプト内に配置して、各質問に特定の回答をすることができます


スクリプト内でそれを行うにはどうすればよいですか?質問ごとに異なる回答を指定することを意味します
Sengo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.