Estou desenvolvendo um script zsh que usa read -k. Se eu executar meu script assim ( echo a | myscript
), ele não conseguirá obter entrada. Aparentemente, isso se deve ao fato de que -k usa /dev/tty como stdin invariavelmente, e você deve informar read para usar stdin como em read -u0
.
Mas então, se eu mudar para -u0 (o que faz o caso anterior funcionar) e executar meu script sem redirecionar tty, ele quebra o script, ele simplesmente não se comporta como executá-lo sem -u0.
EDIT : Após a depuração, parece que o problema é simplesmente que depois de usar -u0, a opção -k1 não lê um único caractere e para mais. read funciona neste caso sem -k, simplesmente armazenando em buffer todas as entradas e salvando-as assim que um EOL chegar
EDIT2 : Depois de mais depuração, sei que é algo relacionado ao modo bruto que não funciona com -u0. Se eu adicionar stty raw/cooked antes da minha leitura, ele funcionará (exceto que o pressionamento de tecla Enter agora é tratado com \r e não \n), mas quando eu o executo com stdin não-tty, ele quebra.
Existe alguma maneira de tornar os dois modos compatíveis?
Na verdade, eu gostaria de entender por que o script se comporta de maneira diferente, se eu leio com -u0 ou não, fd0 é por padrão o mesmo que /dev/tty
read -k
(ler N caracteres) eread -q
(lery
oun
) possuem dois modos de operação:-u
com um número ou-p
a ler o canal usado para se comunicar com o coprocesso atual). Nesse caso, eles apenas lêem o descritor de arquivo.Não há opção de dizer ao zsh para ler de uma fonte específica, mas altere o modo do terminal se estiver lendo de um terminal. Você pode organizar isso sozinho: verifique se a entrada padrão é um terminal e não passe
-u0
se for.