Use o rlwrap , um wrapper readline.
De man rlwrap
rlwrap runs the specified command, intercepting user input in order to provide readline's line editing, persistent history and completion.
e da descrição do pacote Debian rlwrap
:
This package provides a small utility that uses the GNU readline library to allow the editing of keyboard input for any other command. Input history is remembered across invocations, separately for each command; history completion and search work as in bash and completion word lists can be specified on the command line.
Um script de exemplo muito simples:
#! /bin/bash
ynm=(Yes No Maybe)
reply=$(rlwrap -S 'Do you want to continue? ' -H ~/.jakob.history
-e '' -i -f <(echo "${ynm[@]}") -o cat)
echo "reply='$reply'"
Isso usa o modo one-shot de rlwrap
para executar cat
(para obter stdin), mas aceita apenas uma linha de entrada. -o cat
is rlwrap
é o substituto recomendado para read
.
O histórico da linha de comando é armazenado em ~/.jakob.history
, e os itens de conclusão estão no array bash $ynm
.
rlwrap
espera um arquivo como o argumento para a opção -f
. Felizmente, podemos usar a subsituição do processo <(echo "${ynm[@]}")
para fornecer uma matriz em vez de um arquivo.
-i
ativa a insensibilidade a maiúsculas e minúsculas para conclusões.
O -e ''
interrompe o rlwrap
de acrescentar um espaço após uma conclusão bem-sucedida (para que $reply
termine contendo, por exemplo, 'Maybe'
em vez de 'Maybe '
com um espaço à direita)
Se você quiser um padrão já pré-digitado na linha de entrada, você pode usar a opção -P
ou --pre-given
- por exemplo, adicione -P Yes
ao comando rlwrap
no script de exemplo acima. O usuário teria apenas que pressionar Enter para aceitar ou retroceder ou Ctrl - U para apagar o padrão (como é normal para readline
em modo emacs).
veja man rlwrap
para detalhes e mais opções. por exemplo. você pode habilitar a conclusão do nome do arquivo com -c
ou --complete-filenames
.
Verifique se rlwrap
está empacotado para sua distro (é para o Debian e provavelmente para o Ubuntu / Mint / etc, pelo menos) antes de baixar e compilar a fonte.