Pressione espaço para continuar

64

Como eu paro um script bash até que um usuário tenha pressionado Espaço ?

Eu gostaria de ter a pergunta no meu script

Press space to continue or CTRL+C to exit

e, em seguida, o script deve parar e aguardar até que o espaço seja pressionado.

    
por rubo77 04.06.2014 / 12:42

7 respostas

53

Você pode usar 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
    
por 04.06.2014 / 13:03
39

O método discutido neste SO Q & A é provavelmente o melhor candidato para uma alternativa ao comportamento pause ao qual você está acostumado no Windows ao fazer arquivos BAT.

$ read -rsp $'Press any key to continue...\n' -n1 key

Exemplo

Aqui estou executando o acima e simplesmente pressionando qualquer tecla, neste caso a tecla D .

$ read -rsp $'Press any key to continue...\n' -n1 key
Press any key to continue...
$ 

Referências

por 04.06.2014 / 21:27
6
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"

Isso agora imprime um prompt sem uma nova linha, manipula CTRL+C de forma confiável, invoca stty somente quantas vezes forem necessárias e restaura o controle tty exatamente para o estado no qual stty o encontrou. Consulte man stty para obter informações sobre como controlar explicitamente ecos, controlar caracteres e tudo mais.

Você também pode fazer isso:

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

Você poderia fazer isso com ENTER , sem [ testes ] e sem stty como:

sed -n q </dev/tty
    
por 04.06.2014 / 12:59
5

Você pode criar uma função para isso:

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

Então você pode usar isso em todos os lugares no seu script:

pause
    
por 05.06.2014 / 00:24
3

lazy one liner:

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

a desvantagem é que você perde o controle quando o usuário pressiona ctrl + c. O script sempre sairá com o código 130 nesse caso.

    
por 30.06.2016 / 02:07
2

As configurações IFS da cadeia vazia suprimem o comportamento padrão da leitura de aparar espaço em branco.

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

ATUALIZAÇÃO 2018-05-23: Podemos simplificar isso usando a variável REPLY, que não está sujeita à divisão de palavras:

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
    
por 10.01.2017 / 02:32
1

Aqui está uma maneira que funciona em bash e zsh e garante E / S no terminal:

# 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

Coloque no seu .{ba,z}shrc da Great Justice!

    
por 28.06.2018 / 07:22