Como eu posso usar e modificar o histórico dentro de um script bash?

0

Portanto, tenho o seguinte script bash com o nome de "fortunas":

#!/bin/bash -i
REPLY=;
history -w /tmp/fortunes_history_backup; # save history ...
history -c; # and clear it.
while [ ! \( "$REPLY" = "q" -o "$REPLY" = "quit" -o "$REPLY" = "exit" \) ];
do
    clear;
    if [ -n "$REPLY" ]; then
        history -s $REPLY; # store command in history
    fi
    (fortune -c $REPLY;) || (clear; fortune -c;)  # try to use the command as fortune file; 
                                                  # if that file can't be found, use a random one
#    echo 'history -p !-1';
    read -e;
done
history -r /tmp/fortunes_history_backup # restore history

a parte relevante é:

  • eu faço backup do histórico
  • depois eu apago
  • então, cada vez que o usuário digita algo, eu o adiciono ao histórico
  • quando terminar, restauro a história antiga.

O que eu quero agora é que o usuário possa navegar através de seu histórico dentro deste script com as teclas de seta, como no bash normal.

history -p !-1 (receba a entrada mais recente), history -w , history -c e history -r todo o trabalho conforme o esperado; no entanto, pressionar as teclas de seta enquanto o script está em execução não faz nada.

(Antes de ter os comandos de histórico, ele percorria meu histórico antes de executar o script).

Existe alguma maneira de fazer isso funcionar?

(O que eu suspeito que esteja acontecendo é que o bash não atualiza o histórico até que o script termine, o que significaria que não há solução ...)

    
por Lucas Werkmeister 02.07.2013 / 21:09

1 resposta

0

Eu tenho que trabalhar por

  • criando um arquivo de histórico claro
  • anexando cada comando do histórico a esse arquivo e, em seguida,
  • recarregando o histórico desse arquivo toda vez que um comando foi adicionado:

(linha em branco para corrigir o markdown)

#!/bin/bash -i
REPLY=;
backupFile=/tmp/fortunes_history_backup;
tmpFile=/tmp/fortunes_history;
echo -n > $tmpFile; # clear the temporary history file
history -w $backupFile; # save history ...
history -c; # and clear it.

while [ ! \( "$REPLY" = "q" -o "$REPLY" = "quit" -o "$REPLY" = "exit" \) ];
do
    clear;
    if [ -n "$REPLY" ]; then
        echo $REPLY >> $tmpFile;
        history -r $tmpFile
        # history -s $REPLY does not work!
    fi
    (fortune -c $REPLY) || (clear; fortune -c;)  # try to use the command as fortune file; 
                                                 # if that file can't be found, use a random one
    read -e;
done
history -r $backupFile; # restore history

Os comandos essenciais são echo $REPLY >> $tmpFile; history -r $tmpFile; .

Eu ainda ficaria agradecido por qualquer explicação de por que history -s $REPLY; não funciona (ele faz fora do script); parece quase um bug, mas ao mesmo tempo encontrar um bug em bash ( o bash !) parece quase arrogância: D

    
por 03.07.2013 / 17:45