Respostas:
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
Press a key to continue...
, em seguida, que os usuários inexperientes será capaz de encontrar a a
chave e pressione-o; o)
command | myscript.sh
ou myscript.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 ocorra sh
. 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.
Inserir solução
read -rsp $'Press enter to continue...\n'
Solução de escape (com -d $ '\ e')
read -rsp $'Press escape to continue...\n' -d $'\e'
Qualquer solução importante (com -n 1)
read -rsp $'Press any key to continue...\n' -n 1 key
# echo $key
Pergunta com escolha pré-selecionada (com -ei $ 'Y')
read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
# echo $key
Solução de tempo limite (com -t 5)
read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
Alias aprimorado do sono
read -rst 0.5; timeout=$?
# echo $timeout
-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 $?
-s
; man read
e read --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 #osx read -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.
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 ...
echo Press enter to continue; read dummy;
Observe que uma variável precisa ser fornecida como argumento para read
.
read -n1
não é portátil. Uma maneira portátil de fazer o mesmo pode ser:
( trap "stty $(stty -g;stty -icanon)" EXIT
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
) </dev/tty
Além de usar read
, para pressionar apenas ENTER
para continuar, você pode:
sed -n q </dev/tty
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.
do_stuff
read
do_more_stuff
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.
Tente o seguinte:
function pause(){
read -p "$*"
}
Esta função funciona em ambos bash
e zsh
, e garante I / O para o 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-o no seu .{ba,z}shrc
para Grande Justiça!
Sim para usar read
- e há alguns ajustes que o tornam mais útil nos cron
terminais e no terminal.
Exemplo:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
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.
"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.