Como interrompo um script bash até que um usuário tenha pressionado Space?
Eu gostaria de ter a pergunta no meu script
Pressione espaço para continuar ou CTRL+ Cpara sair
e o script deve parar e aguardar até que o espaço seja pressionado.
bash
control-flow
rubo77
fonte
fonte
Respostas:
Você pode usar
read
:fonte
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
else
bloco sempre roda, mesmo quando a barra de espaço é pressionada.bash
. Funciona se você usar emread _
vez disso, se tiver algum outro shell que nãobash
.''
conter um espaço dentro?''
para uma string vazia. Não há espaço dentro. Eu acho que, ele também se encaixa, se você digitar ENTER ou TABO método discutido nas perguntas e respostas SO é provavelmente o melhor candidato para uma alternativa ao
pause
comportamento que você está acostumado no Windows ao executar arquivos BAT.Exemplo
Aqui, estou executando o procedimento acima e simplesmente pressionando qualquer tecla, neste caso a Dtecla.
Referências
fonte
$
antes da string aqui-rsp $'Press
:?echo -e "..."
linha extra . É muito mais compacto nessas situações.Agora, ele imprime um prompt sem uma nova linha à direita, lida com
CTRL+C
segurança, chamastty
apenas quantas vezes for necessário e restaura o controle tty exatamente ao estado em que ostty
encontrou. Procureman stty
informações sobre como controlar explicitamente ecos, controlar caracteres e tudo.Você também pode fazer isso:
Você poderia fazê-lo com
ENTER
, sem[
testes]
e nãostty
como:fonte
Você pode criar uma função para isso:
Então você pode usar isso em qualquer lugar do seu script:
fonte
um forro preguiçoso:
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.
fonte
As configurações
IFS
para string vazia suprimem o comportamento padrão da leitura de aparar o espaço em branco.UPDATE 2018-05-23: Podemos simplificar isso usando a variável REPLY, que não está sujeita à divisão de palavras:
fonte
Aqui está uma maneira que funciona em ambos
bash
ezsh
, e garante I / O para o terminal:Coloque-o no seu
.{ba,z}shrc
para Grande Justiça!fonte