ユーザーが押すまでbashスクリプトを停止する方法 Space?
スクリプトに質問があります
スペースキーを押して続行するか CTRL+C 出る
スクリプトは停止し、スペースが押されるまで待機します。
read
を使用できます:
read -n1 -r -p "Press space to continue..." key
if [ "$key" = '' ]; then
# Space pressed, do something
# echo [$key] is empty when SPACE is pressed # uncomment to trace
else
# Anything else pressed, do whatever else.
# echo [$key] not empty
fi
このSO Q&Aで説明されている方法は、BATファイルを実行するときにWindowsで慣れているpause
の動作の代替策として、おそらく最良の候補です。
$ read -rsp $'Press any key to continue...\n' -n1 key
ここで私は上記を実行してから、任意のキーを押すだけです。この場合、 D キー。
$ read -rsp $'Press any key to continue...\n' -n1 key
Press any key to continue...
$
そのための関数を作成できます。
pause(){
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
}
次に、これをスクリプトのどこでも使用できます。
pause
hold=' '
printf "Press 'SPACE' to continue or 'CTRL+C' to exit : "
tty_state=$(stty -g)
stty -icanon
until [ -z "${hold#$in}" ] ; do
in=$(dd bs=1 count=1 </dev/tty 2>/dev/null)
done
stty "$tty_state"
これにより、末尾の改行なしでプロンプトが出力され、CTRL+C
を確実に処理し、stty
を必要な回数だけ呼び出し、制御ttyをstty
が検出した状態に正確に復元します。エコーや制御文字などを明示的に制御する方法については、man stty
をご覧ください。
これを行うこともできます:
printf "Press any key to continue or 'CTRL+C' to exit : "
(tty_state=$(stty -g)
stty -icanon
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
stty "$tty_state"
) </dev/tty
ENTER
、[
テストなし、]
なし、stty
なしで実行できます。
sed -n q </dev/tty
レイジーワンライナー:
echo "Press any key to continue or Ctrl+C to cancel"
read && do_something.sh
欠点は、ユーザーがctrl + cを押すとコントロールが失われることです。その場合、スクリプトは常にコード130で終了します。
空の文字列へのIFS
の設定は、空白のトリミングの読み取りのデフォルト動作を抑制します。
try_this() {
echo -n "Press SPACE to continue or Ctrl+C to exit ... "
while true; do
# Set IFS to empty string so that read doesn't trim
# See http://mywiki.wooledge.org/BashFAQ/001#Trimming
IFS= read -n1 -r key
[[ $key == ' ' ]] && break
done
echo
echo "Continuing ..."
}
try_this
UPDATE 2018-05-23:単語分割の影響を受けないREPLY変数を使用して、これを簡略化できます。
try_this() {
echo -n "Press SPACE to continue or Ctrl+C to exit ... "
while true; do
read -n1 -r
[[ $REPLY == ' ' ]] && break
done
echo
echo "Continuing ..."
}
try_this
bash
とzsh
の両方で機能し、端末へのI/Oを保証する方法を次に示します。
# Prompt for a keypress to continue. Customise Prompt with $*
function pause {
>/dev/tty printf '%s' "${*:-Press any key to continue... }"
[[ $ZSH_VERSION ]] && read -krs # Use -u0 to read from STDIN
[[ $BASH_VERSION ]] && </dev/tty read -rsn1
printf '\n'
}
export_function pause
.{ba,z}shrc
大正義のために!