私はシェルスクリプトを書いています:
#!/bin/bash
i=1;
sp="/-\|";
no_config=true;
echo "type \"continue\" to exit this while loop";
echo "if you feel the conditions for continuing sucessfully have been met... ";
while $no_config;
do printf "\b${sp:i++%${#sp}:1}";
[[ ! $(pidof SupremeCommande) && -f ~/My\ Documents/newfile ]] && no_config=false;
sleep 1;
done;
# do more stuff
これで、ユーザーが開始したループ終了も追加したいと思います。
複雑に見えますね。
当初、私はこれを見つけて希望を高めました。 https://unix.stackexchange.com/a/228152/228658 ただし、読み取りコマンドの実行が停止したことがわかりました。
私はこれをしたくありません。私はいつでも「q」を押すと終了しますが、上下にスクロールする機能を妨げないマニュアルページのようなものが欲しいです。バックグラウンドで入力を慎重に待っています。
シェルスクリプトでこれをどのように達成できますか?
ベストアンサー1
より簡単な解決策は、ユーザーにCtrl-C
ループ終了を押してSIGINT
シグナルを送信し、スクリプトを終了するように指示することです。
スクリプトを終了する前に他のタスクを実行するには、次の信号をキャッチできます。
cleanup() {
# ...
exit 0
}
trap 'cleanup' INT
あるいは、サブシェルでシェルの 1 つを実行して、シェルの 1 つがシャットダウンした場合、他のシェルもシャットダウンすることもできます。これにより、入力の1つをブロックし、他の入力は異なるチェックを実行できます。
#!/bin/bash
i=1
sp="/-\|"
no_config=true
echo "type \"continue\" to exit this while loop if you feel the conditions for continuing sucessfully have been met... "
(
while $no_config
do
printf "\b${sp:i++%${#sp}:1}"
[[ ! $(pidof SupremeCommande) && -f ~/My\ Documents/newfile ]] && no_config=false
sleep 1
done
kill $$
) &
child_pid=$!
while $no_config
do
read -r typed_continue
[[ "$typed_continue" = "continue" ]] && no_config=false
sleep 1
done
kill $child_pid