web-dev-qa-db-ja.com

バックグラウンドで実行されているシェルスクリプト内でプロンプトに応答するにはどうすればよいですか?

HP-UXサーバーへのソフトウェアのインストールをスクリプト化しています。スクリプトが開始すると、インストールパスを入力するプロンプトが表示されます。実行を継続できるように、スクリプトへのパスを渡す必要があります。この必要性が存在するスクリプト内の場所は1つだけです。

スクリプトからのプロンプトは次のとおりです。デフォルトパスの場合はEnterキーを押すか、ソフトウェアをインストールするパスを入力してください

デフォルトのパスを使用したくないので、新しいパスを入力する必要があります。しかし、このスクリプトはバックグラウンドで実行されるため、パスを指定する必要があります。スクリプト形式での正確な応答がわかりません。

8
37Scheper

パイプを使用して、スクリプトの標準入力に回答をエコーできます。

echo "My/Path/not/default"| yourscript.sh
4
X Tian

スクリプトの開始時にすべての入力を提供できる場合は、 リダイレクト プログラムの入力によって提供します。つまり、/path/to/installerを実行する代わりに、

{ echo '/the/path/where/to/install';
  echo 'answer to the second Prompt';
} | /path/to/installer

または hereドキュメントを使用します

/path/to/installer <<'EOF'
/the/path/where/to/install
answer to the second Prompt
EOF

時々プログラムと対話したいが、その間に端末を他のものに使用したい場合は、 Screentmux などの ターミナルマルチプレクサー でプログラムを実行します。 screenで、screenを実行してセッションを開始し、プログラムを開始します。他のことをするには、 Ctrl+A、 c 2番目のウィンドウを作成し、 Ctrl+A、 n ウィンドウ間を移動します。画面を終了してプログラムを実行したままにするには、を押します Ctrl+A、 d (「デタッチ」)。既存のScreenセッションに戻るには、screen -rdを実行します(screenオプションなしで新しいセッションを開始します)。

自動回答を提供するには、次のいずれかを使用できます。

insaller.sh < an_input_file

または

command-line | installer.sh

以下の例のように、installer.shスクリプトがread -pを使用している場合は、注意する点があります。

read -p "Press ENTER for default path or enter path to install software:" answer

man bashは、標準入力が端末でない場合は何も出力しないことを指定します。

これがあなたの状況であるなら、あなたはこの奇妙なことを試すことができます:

( sleep 30 ; printf "/my/own/path\n" ) | insaller.sh

秒数(上記の例では30)を状況に合わせる必要があります。

read -p未使用がインストールスクリプト内で発生する場合は、このGNUソリューションを試してみます。

 tempdir="$(mktemp -d)"
 mkfifo  "${tempdir}"/input
 touch "${tempdir}"/output.log
 ./installer.sh <"${tempdir}"/input >"${tempdir}"/output.log 2>&1 &
 installerpid=$!
 tail --pid=$installerpid -fn 1 "${tempdir}"/output.log | ( fgrep -q "Press ENTER for default path or enter path to install software:"; printf "/new/path\n" ) >> "${tempdir}"/input &

 # ... do stuff


 # before ending the script, just wait that all background processes stop
 wait
 rm -f "${tempdir}"/input "${tempdir}"/output.log

アイデアは、2つのバックグラウンドコマンドラインを使用することです。1つはインストールスクリプト用で、もう1つはプロンプトを待って回答を提供するためです。

名前付きパイプ(input)と通常のファイル(output.log)が通信に使用されます。

tail --pid=$installerpid -fn 1 "${tempdir}"/output.logは、output.logファイルに書き込まれているとおりの行を出力します。インストーラスクリプトが終了すると終了します。

( fgrep -q ... ; printf .. ) >> ...input:プロンプトが見つかるまでブロックし、インストールスクリプトへの新しいパスを提供します。

0
Jay jargot