lido com histórico

9

Como posso fazer o histórico de suporte do comando read embutido, pressionando a tecla para cima / baixo para alternar entre eles?

Eu tentei capturar quando você pressionou a tecla para cima, no entanto, parece não funcionar com read :

read -p '> ' -n 3 foo
echo
echo -n "$foo" | hexdump

Pressionar as teclas de seta parece funcionar e eu posso detectá-lo usando isso, no entanto, se eu pressionar a a , ele falhará como ele só lerá o primeiro caractere do identificador da seta para cima, enquanto o terceiro é necessário para distinguir as diferentes teclas de seta.

    
por Tyilo 17.10.2012 / 17:09

2 respostas

8

Você pode usar rlwrap para isso, se não se importar de instalar o software.

Você provavelmente desejará manter um arquivo de histórico separado que apenas mantenha o histórico para o prompt específico em seu script (isto é, evite misturar com o histórico de comandos do shell do usuário).

Veja um exemplo que pode funcionar para você:

#!/bin/sh
# Save in rlwrap_example.sh

HISTORY=$HOME/.myscript_history
USERINPUT=$(rlwrap -H $HISTORY sh -c 'read REPLY && echo $REPLY')
echo "User said $USERINPUT"

$ ./rlwrap_example.sh
hello
User said hello

No script acima, o usuário pode usar toda a funcionalidade readline do GNU , com histórico veiculado de - e armazenado em - ~/.myscript_history . Ajuste conforme necessário.

Como alternativa, você pode usar o read -e do bash, que ativa readline para invocações de read , mas você provavelmente achará sua funcionalidade de histórico muito limitada (ou seja, quase inexistente).

    
por 17.10.2012 / 18:11
8

Para copiar a excelente resposta de Mike Stroyan desta antiga lista de discussão :

You can use "history -r" to read a file into the shell's history and "history -s" to add each line that you read into the history. Then use history -w to save the history back to the file. Here is an example with vi style readline editing.

#!/bin/bash
history -r script_history
set -o vi
CMD=""
while true
do
    echo "Type something"
    read -e CMD
    history -s "$CMD"
    echo "You typed $CMD"
    case "$CMD" in
        stop)
            break
            ;;
        history)
            history
            ;;
    esac
done
history -w script_history
echo stopping
    
por 12.08.2016 / 06:45