Bem, de acordo com algumas de suas edições, você tem CTRL+J
ligado a um comando bindkey
macro. Isso explica seu problema de bash
considerando o comportamento padrão de readline
.
Geralmente, readline
lê a entrada em algo muito parecido com o modo stty raw
. Os caracteres de entrada são lidos assim que são digitados e o editor de linha do shell manipula seu próprio buffer. readline
define o terminal como raw quando recebe o primeiro plano e o restaura para qualquer estado anterior ao chamar outro grupo de processos em primeiro plano.
CTRL+J
é uma nova linha ASCII. ABCDEFGHIJ
é 10 bytes do NUL. Como você configurou readline
para comer esse caractere e, subsequentemente, expandir o que resta de qualquer linha de comando em que ele faz com a conclusão do menu, a digitação antecipada não funcionará. O terminal está em um estado diferente quando a digitação antecipada é armazenada em buffer pela disciplina de linha do kernel do que quando readline
está em primeiro plano.
Quando readline
está no primeiro plano, ele faz sua própria tradução para os retornos de transporte de entrada - > novas linhas e o driver do terminal não o converte em nada. Quando você insere sua entrada de digitação antecipada, no entanto, o driver do terminal geralmente traduz retornos para novas linhas conforme pode ser configurado com stty [-]icrnl
. E assim, sua chave de retorno é suficiente para os comandos inseridos ao vivo, mas as novas linhas enviadas pela linha de disciplina do terminal estão sendo interpretadas como comandos de menu completo.
Você pode dizer ao driver do terminal para parar essa tradução com stty -icrnl
. É provável que isso leve pelo menos um pouco de tempo para se acostumar. Outros comandos que aceitam entrada de terminal geralmente esperam novas linhas ao invés de retornos, e assim você terá que usar explicitamente CTRL+J
quando eles controlarem o primeiro plano, ou então ensiná-los a manipular os retornos como bash
.
Você já mencionou que read
não funciona como esperado ao ler o terminal. Novamente, é provável que você use explicitamente CTRL+J
para finalizar uma linha de entrada. Ou ... você pode ensinar:
read()
if [ -t 0 ]
then command read -d $'\r' "$@"
else command read "$@"
fi
Provavelmente será muito menos trabalhoso a longo prazo se você encontrar uma chave diferente para o menu completo, no entanto. As novas linhas são muito importantes para a maioria dos aplicativos de terminal.