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.
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.
Respostas:
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
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 em read _
vez disso, se tiver algum outro shell que não bash
.
''
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 TAB
O 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.
$ read -rsp $'Press any key to continue...\n' -n1 key
Aqui, estou executando o procedimento acima e simplesmente pressionando qualquer tecla, neste caso a Dtecla.
$ read -rsp $'Press any key to continue...\n' -n1 key
Press any key to continue...
$
$
antes da string aqui -rsp $'Press
:?
echo -e "..."
linha extra . É muito mais compacto nessas situações.
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"
Agora, ele imprime um prompt sem uma nova linha à direita, lida com CTRL+C
segurança, chama stty
apenas quantas vezes for necessário e restaura o controle tty exatamente ao estado em que o stty
encontrou. Procure man stty
informações sobre como controlar explicitamente ecos, controlar caracteres e tudo.
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 fazê-lo com ENTER
, sem [
testes ]
e não stty
como:
sed -n q </dev/tty
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 qualquer lugar do seu script:
pause
As configurações IFS
para string vazia suprimem o comportamento padrão da leitura de aparar o 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
UPDATE 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
Aqui está uma maneira que 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!