web-dev-qa-db-ja.com

bashスクリプトに対話型プロンプトに答えさせる

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

87
tj111

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

yesからの入力をパイプするだけでもいいかもしれません。

59
unwind

シンプルな

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

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

142
Loïc Février

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

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

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

$> yes Y |./your_script

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

$> yes N |./yout_script
12
douardo

私の状況では、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&EOFReturn Linesと組み合わせてを使用すると、必要に応じてプロンプトの各質問に答えることができます。 それぞれの新しい行は新しい答えです。

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

この方法のもう1つの利点は、YまたはNだけで答えることができることに注意してください...実際には、空白で答えることができます!

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

8
Joseph Astrahan

このための特別な組み込みユーティリティがあります-' yes '。

同じ答えですべての質問に答えるには、次を実行できます。

yes [answer] |./your_script

または、スクリプトに入れて、各質問に具体的な答えを付けることができます

2
Asaf Pinhassi