Дождитесь нажатия клавиши на скрипте оболочки - PullRequest
0 голосов
/ 07 января 2019

Я сделал скрипт Bourne shell , и мне нужно улучшить его, добавив «Нажмите клавишу Esc для выполнения команды».

Это рабочий пример в BASH :

#!/bin/bash
read -s -n1 key
case $key in
$'\e') echo "escape pressed";;
*) echo "something else" ;;
esac

Но я не смог заставить его работать в оболочке Bourne - Ошибка: «read: Illegal option -s»

Не могли бы вы помочь мне найти решение оболочки Bourne, потому что почти вся информация в Google относится к заявлениям Bash.

1 Ответ

0 голосов
/ 08 января 2019

Согласно нашим комментариям в комментариях, вашему конкретному вопросу и вопросу о Unix & Linux Stack Exchange Могу ли я прочитать один символ из stdin в оболочке POSIX? , это полное решение:

#!/bin/bash

# usage: readc <variable-name>
function readc()
{
  if [ -t 0 ]; then
    # if stdin is a tty device, put it out of icanon, set min and
    # time to sane value, but don't otherwise touch other input or
    # or local settings (echo, isig, icrnl...). Take a backup of the
    # previous settings beforehand.
    saved_tty_settings=$(stty -g)
    stty -icanon min 1 time 0
  fi
  eval "$1="
  while
    # read one byte, using a work around for the fact that command
    # substitution strips trailing newline characters.
    c=$(dd bs=1 count=1 2> /dev/null; echo .)
    c=${c%.}

    # break out of the loop on empty input (eof) or if a full character
    # has been accumulated in the output variable (using "wc -m" to count
    # the number of characters).
    [ -n "$c" ] &&
      eval "$1=\${$1}"'$c
        [ "$(($(printf %s "${'"$1"'}" | wc -m)))" -eq 0 ]'; do
    continue
  done
  if [ -t 0 ]; then
    # restore settings saved earlier if stdin is a tty device.
    stty "$saved_tty_settings"
  fi
}

# Reads one character.
readc "key"

# Acts according to what has been pressed.
case $key in
  $'\e') echo "escape pressed";;
  *) echo "something else" ;;
esac
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...