Итак, у меня есть следующий скрипт bash с псевдонимом "fortunes":

#!/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

соответствующая часть:

  • Я делаю резервную копию истории
  • тогда я это очищаю
  • затем каждый раз, когда пользователь вводит что-то, я добавляю это в историю
  • когда я закончу, я восстановлю старую историю.

Теперь я хочу, чтобы пользователь мог перемещаться по своей истории внутри этого скрипта с помощью клавиш со стрелками, как в обычном bash.

history -p !-1 (получить последнюю запись), history -w , history -c и history -r все работают как положено; однако нажатие клавиш со стрелками во время работы скрипта ничего не делает.

(До того, как у меня были команды history, перед запуском скрипта проходила бы история моего bash.)

Есть ли способ заставить эту работу?

(Я подозреваю, что происходит то, что bash не обновляет историю, пока сценарий не завершится, что означает, что решения не существует ...)

1 ответ1

0

Я заставил его работать

  • создание файла чистой истории
  • добавив каждую команду истории в этот файл, а затем
  • перезагрузка истории из этого файла при каждом добавлении команды:

(пустая строка для исправления уценки)

#!/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

Основные команды: echo $REPLY >> $tmpFile; history -r $tmpFile; ,

Я все еще был бы благодарен за любое объяснение того, почему history -s $REPLY; не работает (работает вне скрипта); он чувствует себя почти как ошибка, но в то же время найти ошибку в bash bash кажется почти как гордыня:D

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .