Simulando READLINE_LINE no Bash 4.0

2

Eu estou tentando fazer parte do meu código bash 3.X compatível e tenho uma chave de ligação que utiliza READLINE_LINE dentro de sua função de retorno de chamada. As versões 3.0 do Bash não fornecem o READLINE_LINE, portanto, preciso de uma maneira alternativa de acessar a linha atualmente digitada, mas não executada. Eu acho que eu preciso de algum código simples (C, esperançosamente) para pegar o comando atualmente digitado mas não executado de um terminal Bash e imprimi-lo para stdout (eu vou capturá-lo de lá). Minha função irá então manipulá-lo e depois colocá-lo de volta (eu posso fazer isso )

Eu explorei o Readline e olhei para a conclusão do comando. Nenhum deles parece ser o que eu preciso. Passei muitas horas lendo sobre tty e readline e estou no final, o comando está no terminal, então deve existir em algum lugar, certo?

    
por user1260199 27.12.2013 / 08:23

1 resposta

2

Eu acho que você tem um equívoco fundamental sobre a divisão do trabalho entre o terminal e o shell. O comando não executado fica dentro da memória do bash, não está no terminal. Assim que você digita um caractere ou uma tecla de função, essas informações são enviadas para o bash, e é o bash que gerencia os comandos de edição, que atualiza a exibição, fornece a conclusão e assim por diante. A biblioteca readline faz parte do bash. Para mais detalhes, leia Qual é a diferença exata entre um 'terminal', um 'shell', um 'tty' e um 'console'?

O resultado é que o código que você quer escrever para manipular o comando tem que ficar dentro do bash: ele precisa ir entre uma parte do bash e outra parte do bash.

Você pode colocar um programa intermediário entre o terminal e o bash, mas se você fizer isso, perderá o benefício da conclusão e de outras sutilezas.

A variável READLINE_LINE foi introduzida no bash 4 porque não há como fazer a mesma coisa no bash 3. Se o que você está fazendo exigir, sua melhor opção é mudar para o bash 4 ou zsh.

    
por 28.12.2013 / 02:55