
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 -rd
screen
答え3
自動回答を提供するには、次のいずれかの方法を使用できます。
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
:プロンプトが見つかるまでブロックし、インストールスクリプトへの新しいパスを提供します。