web-dev-qa-db-ja.com

続けるにはSpaceキーを押してください

ユーザーが押すまでbashスクリプトを停止する方法 Space

スクリプトに質問があります

スペースキーを押して続行するか CTRL+C 出る

スクリプトは停止し、スペースが押されるまで待機します。

84
rubo77

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
63

この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...
$ 

参考文献

49
slm

そのための関数を作成できます。

pause(){
 read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
}

次に、これをスクリプトのどこでも使用できます。

pause
9
rubo77
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
6
mikeserv

レイジーワンライナー:

echo "Press any key to continue or Ctrl+C to cancel"
read && do_something.sh

欠点は、ユーザーがctrl + cを押すとコントロールが失われることです。その場合、スクリプトは常にコード130で終了します。

3
gcb

空の文字列への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
2
Robin A. Meade

bashzshの両方で機能し、端末への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大正義のために!

2
Tom Hale