私はコマンドを引数として受け入れ、バックグラウンドで実行し、ユーザーが任意のキーを押してコマンドを終了できるようにするbash関数を作成しました。この部分はうまくいきます。
ただし、ダイアログ メーターにパイプするとwhiptail
hiptail が期待どおりに実行されますが、戻った後は端末にキーの押下が表示されなくなります。それでもコマンドを実行できますが、入力した内容は画面に印刷されて表示されません。出力形式も奇妙に指定され、stdoutが$
。
そのコマンドがこの動作を引き起こすことは明らかですread
が、その理由を理解できません。誰でも洞察力を提供できますか?
#!/bin/bash
function killOnKeypress() {
local runcommand="${1}"
local args=(${@:2})
# Run the command in the background
"${runcommand}" ${args[@]} &
# Get the process id of $runcommand
local pid=$!
# Monitor $runcommand and listen for keypress in foreground
while kill -0 "${pid}" >/dev/null 2>&1; do
# If key pressed, kill $runcommand and return with code 1
read -sr -n 1 -t 1 && kill "${pid}" && return 1
done
# Set $? to return code of $runcommand
wait $pid
# Return $runcommand's exit code
return $?
}
function count100() {
for ((i = 0; i < 100; i++)); do
echo $i
sleep .02
done
}
killOnKeypress "count100" | whiptail \
--gauge "Counting to 100" \
16 56 \
0
答え1
これはOPの質問に対する答えではありませんが、修正/解決方法を見つけるためにここに来る他の人には便利です。
NickDがコメントで指摘したように、hiptailは-echoを設定します(私の環境ではエコーではありません)。
スクリプトを変更するには、次のように入力します。
stty echo
それの終わりに。
"stty -a"を使用すると、スクリプトの実行前後にスクリプト(whiptail)への変更を確認できます。
もちろん、違いを見つけやすくするために、出力をファイルに保存できます。
stty -a > good_terminal
スクリプトを実行してください。ターミナルがめちゃくちゃになりました。 「reset」、「tset」、または「stty sane」にリセットし、「stty」コマンドを再実行して比較します。
stty -a > bad_terminal
diff good_terminal bad_terminal
答え2
これにより、whiptail
端末が奇妙な状態になる可能性があります。コマンドで試してくださいstty sane
。 (盲目的に入力する必要があるので注意してください。)これが端末の問題を解決する場合は、これが問題かもしれません。