Eu não sou bom em bash e Linux. Estou lendo um script e encontrei a seguinte função.
get_char()
{
SAVEDSTTY=`stty -g`
stty -echo
stty cbreak
dd if=/dev/tty bs=1 count=1 2> /dev/null
stty -raw
stty echo
stty $SAVEDSTTY
}
Basicamente, ele é usado para implementar Pressione qualquer tecla para continuar um recurso como este.
echo "Press any key to continue!"
char=`get_char`
Eu sei que você pode usar o read
comando embutido para implementar isso. Por exemplo:
read -rsn1 -p "Press any key to continue"
Existe algum motivo para usar esta função em vez do read
comando embutido?
A
get_char
função da pergunta tem problemas com chaves wrt que geram caracteres multibyte e com o fato de questty
atua no stdin masdd
lê de/dev/tty
[1], então vou usar uma versão "fixa" e simplificada dela para fazer a comparação:Algumas diferenças entre
k=$(get_char)
eread -rsn1 k
são:o primeiro é portátil; funciona da mesma forma em
dash
,bash
,zsh
, etc.read -rsn1
só funciona embash
eksh
.quando uma tecla como
F1
é pressionada,k=$(get_char)
será definidok
como todo o escape gerado pelaF1
tecla (^[OP
) em vez de comer a entrelinha^[
(Esc) e deixarOP
para depois. A mesma coisa se aplica a qualquer chave que gera vários caracteres.Ctrl-C
(VINTR
),Ctrl-Q
(VQUIT
) ouCtrl-Z
(VSUSP
) fará comk=$(get_char)
que seja definidok
para o caractere de controle bruto (\x03
,\x11
ou\x1a
), enquanto interromperá ou suspenderá o script quando oread -rsn1
for usado [2].[1] Se ele deve ler do tty de controle, é simples usá-lo como
k=$(get_char </dev/tty)
[2]
read -rsn1
falhará ao restaurar as configurações do tty se o script foi suspenso comCtrl-Z
e depois retomado comfg
.Exemplo quando usado a partir de um shell com um editor de linha - que está mexendo com as configurações do tty:
Ou quando usado a partir de um shell que não mexe com as configurações do tty (por exemplo
dash
: ):