обрабатывать пользовательский ввод на фоне - PullRequest
5 голосов
/ 22 апреля 2011

Я хочу обработать пользовательский ввод, но в фоновом режиме, как в новой теме.

Например, показать индикатор выполнения, и когда пользователь нажимает R , индикатор выполнения сбрасывается, или, если пользователь нажимает Q , сценарий завершается.

Я не хочу, чтобы скрипт ждал ввода пользователя. Просто визуализируйте все, и если пользователь нажмет любую клавишу, сделайте что-нибудь.

Это возможно в bash?

Заранее спасибо.

РЕДАКТИРОВАТЬ: Мне нужно, чтобы скрипт ВСЕГДА читал пользовательский ввод, но не прерывал выполнение основного цикла. Сложно Я понимаю по-английски

_handle_keys()
{
    read -sn1 a
    test "$a" == `echo -en "\e"` || continue
    read -sn1 a
    test "$a" == "[" || break
    read -sn1 a

    case "$a" in
        C) # Derecha
            if [ $PALETTE_X -lt $(($COLUMNS-$PALETTE_SIZE)) ] ; then
                PALETTE_X=$(($PALETTE_X+1))
            fi
        ;; 
        D) # Izquierda
            if [ $PALETTE_X -gt 0 ] ; then
                PALETTE_X=$(($PALETTE_X-1))
            fi
        ;;
    esac
}
render()
{
    clear
    printf "\033[2;0f BALL (X:${BALL_X} | Y:${BALL_Y})"
    _palette_render # Actualiza la paleta
    _ball_render
}

while true
do
    LINES=`tput lines`
    COLUMNS=`tput cols`

    render
    _handle_keys
done

В моем сценарии шар перемещается (render> _ball_render) только при нажатии клавиши, потому что _handle_keys ждет ввода пользователя.

Я сделал некрасивое решение с read -t0.1, но мне это не нравится

PD: Извините за мой последний комментарий, время редактирования заканчивается в середине моего редактирования

Ответы [ 2 ]

7 голосов
/ 22 апреля 2011

Вот техника, которая, кажется, работает.Я основываю это на ответе Сэма Хочевара на Bash: Как завершить бесконечный цикл нажатием любой клавиши? .

#!/bin/bash

if [ ! -t 0 ]; then
  echo "This script must be run from a terminal"
  exit 1
fi

stty -echo -icanon time 0 min 0

count=0
keypress=''
while true; do
  let count+=1
  echo -ne $count'\r'

  # This stuff goes in _handle_keys
  read keypress
  case $keypress in
  # This case is for no keypress
  "")
    ;;
  $'\e[C')
    echo "derecha"
    ;;
  $'\e[D')
    echo "izquierda"
    ;;
  # If you want to do something for unknown keys, otherwise leave this out
  *)
    echo "unknown input $keypress"
    ;;
  esac
  # End _handle_keys
done

stty sane

Если пропущен stty sane (например, потому что скрипт получаетубитый Ctrl - C ), терминал останется в странном состоянии.Возможно, вы захотите взглянуть на оператор trap, чтобы решить эту проблему.

1 голос
/ 17 декабря 2013

Вы также можете добавить «сброс» в конец скрипта, чтобы вернуть терминал в исходное состояние, или он может выглядеть заблокированным. Он также очистит экран, поэтому можно добавить паузу перед выполнением команды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...