バックグラウンドで実行されるシェルスクリプトのプロンプトにどのように応答しますか?

バックグラウンドで実行されるシェルスクリプトのプロンプトにどのように応答しますか?

HP-UXサーバーにソフトウェアをインストールするためのスクリプトを作成しています。スクリプトが起動すると、インストールパスの入力を求められます。引き続き実行できるように、スクリプトにパスを渡す必要があります。この要件が存在するスクリプトには1つの場所しかありません。

スクリプトプロンプトは次のとおりです。デフォルトのパスを表示するにはEnterキーを押すか、ソフトウェアをインストールするにはパスを入力します。

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

答え1

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

echo "My/Path/not/default"| yourscript.sh

答え2

スクリプトの起動時にすべての入力を提供できる場合は、次のようにできます。リダイレクトプログラム入力。つまり、/path/to/installer走る代わりに走ってください。

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

または使用ここのドキュメント:

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

時々プログラムと対話したいが、他のタスクにも端末を使用するには、次の環境でプログラムを実行します。ターミナルマルチプレクサ例えば画面またはマルチプレクサ。 screenを使用してを実行してセッションを開始し、screenプログラムを起動します。他のタスクを実行するには、+を押してCtrl2番目のウィンドウを作成し、+を押してウィンドウ間を移動します。画面を終了してプログラムを実行し続けるには、+、(「分離」)を押します。既存のスクリーンセッションに戻るには、実行します(オプションなしで新しいセッションが開始されます)。AcCtrlAnCtrlAdscreen -rdscreen

答え3

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

insaller.sh < an_input_file

または

command-line | installer.sh

installer.shread -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:プロンプトが見つかるまでブロックし、インストールスクリプトへの新しいパスを提供します。

関連情報