read
faz isso:
user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$
O -n1
especifica que aguarda apenas um único caractere. O -r
coloca no modo bruto, o que é necessário porque, caso contrário, se você pressionar algo como barra invertida, ele não será registrado até você pressionar a próxima tecla. O -p
especifica o prompt, que deve ser citado se contiver espaços. O key
argumento é necessário apenas se você quiser saber qual tecla eles pressionaram; nesse caso, você pode acessá-lo $key
.
Se você estiver usando o Bash, também poderá especificar um tempo limite com -t
, o que fará com que a leitura retorne uma falha quando uma tecla não for pressionada. Então, por exemplo:
read -t5 -n1 -r -p 'Press any key in the next five seconds...' key
if [ "$?" -eq "0" ]; then
echo 'A key was pressed.'
else
echo 'No key was pressed.'
fi
"Enter any non-NUL character to continue"
. Algumas teclas não enviar qualquer personagem (comoCtrl
...) e algumas enviar mais de um (comoF1
,Home
...).bash
ignora caracteres NUL.Press a key to continue...
, em seguida, que os usuários inexperientes será capaz de encontrar aa
chave e pressione-o; o)command | myscript.sh
oumyscript.sh | command
. Veja esta resposta para uma solução.read: 1: read: Illegal option -n
certificar-se de incluir seu comando,bash -c 'command && command'
etc., pois é provável que esse erro ocorrash
. Estou fazendo isso em um comando de Lando wrapper.Eu uso muito essas maneiras muito curtas e são como as soluções @theunamedguy e @Jim, mas com tempo limite e modo silencioso além disso.
Eu amo especialmente o último caso e o uso em muitos scripts que são executados em loop até o usuário pressionar Enter.
Comandos
Inserir solução
Solução de escape (com -d $ '\ e')
Qualquer solução importante (com -n 1)
Pergunta com escolha pré-selecionada (com -ei $ 'Y')
Solução de tempo limite (com -t 5)
Alias aprimorado do sono
Explicação
-r especifica o modo bruto, que não permite caracteres combinados como "\" ou "^".
-s especifica o modo silencioso e porque não precisamos de saída do teclado.
-p $ ' prompt ' especifica o prompt, que precisa estar entre $ 'e' para deixar espaços e caracteres de escape. Cuidado, você deve colocar entre aspas simples com o símbolo de dólares para beneficiar caracteres que escaparam, caso contrário, poderá usar aspas simples.
-d $ ' \ e ' especifica escappe como caractere delimitador; portanto, como um caractere final para a entrada atual, é possível colocar qualquer caractere, mas tenha cuidado ao colocar um caractere que o usuário possa digitar.
-n 1 especifica que ele precisa apenas de um único caractere.
-e especifica o modo readline.
-i $ ' Y ' especifica Y como texto inicial no modo readline.
-t 5 especifica um tempo limite de 5 segundos
A tecla serve no caso de você precisar conhecer a entrada, no caso -n1, a tecla que foi pressionada.
$? serve para saber o código de saída do último programa, para leitura, 142 em caso de tempo limite, 0 entrada correta. Coloque $? em uma variável o mais rápido possível, se você precisar testá-la após alguns comandos, porque todos os comandos reescreveriam $?
fonte
-s
;man read
eread --help
ajuda não ajudou no Ubuntu 10.04.1 LTS. Editar:help read
fez; o resto está obsoleto?read: -i: invalid option
o ex.read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
em #osxread -rp $'kill-server: Are you sure (Y/n) : ' -d $'Y' key;
funciona para mim. `-i
funciona perfeitamente no Ubuntu, também não sei se-d
funciona da mesma maneira no OSX.read
sem nenhum parâmetro só continuará se você pressionar enter. Opause
comando do DOS continuará se você pressionar qualquer tecla. Useread –n1
se você deseja esse comportamento.fonte
Isso funcionou para mim em vários sabores do Linux, onde algumas dessas outras soluções não (incluindo as mais populares aqui). Eu acho que é mais legível também ...
Observe que uma variável precisa ser fornecida como argumento para
read
.fonte
read -n1
não é portátil. Uma maneira portátil de fazer o mesmo pode ser:Além de usar
read
, para pressionar apenasENTER
para continuar, você pode:fonte
status=none
também não é portátil. Redirecione stdout e stderr para / dev / null.read -r line < /dev/tty
seria enought para pressionar ENTER ... .settings=$(stty -g); stty raw; dd ...; stty "$settings"
para salvar e restaurar as configurações de tty.tr
edição também poderia funcionar?tr
armazenaria em buffer sua saída como um tubo, e os teclados de fora dos EUA têm teclas que enviam caracteres fora do\1-\177
intervalo.dd
é a maneira idiomática aqui.Se você apenas precisar pausar um loop ou script, e estiver feliz em pressionar Enter em vez de qualquer tecla,
read
por si só fará o trabalho.Não é fácil para o usuário final, mas pode ser suficiente nos casos em que você está escrevendo um script rápido e precisa pausá-lo para fazer algo manualmente em segundo plano.
fonte
Tente o seguinte:
fonte
Esta função funciona em ambos
bash
ezsh
, e garante I / O para o terminal:Coloque-o no seu
.{ba,z}shrc
para Grande Justiça!fonte
Sim para usar
read
- e há alguns ajustes que o tornam mais útil noscron
terminais e no terminal.Exemplo:
O -n 120 faz o tempo limite da instrução de leitura expirar após 2 minutos, para que não seja bloqueado
cron
.No terminal, ele fornece 2 minutos para ver quanto tempo o
rsync
comando levou para executar.Então o subsequente
echo
é para que o prompt do bash subseqüente apareça na próxima linha.Caso contrário, será exibido na mesma linha diretamente após "continuar ..." quando Enterfor pressionado no terminal.
fonte