如何使用和修改 Bash 脚本中的历史记录?

如何使用和修改 Bash 脚本中的历史记录?

因此,我有以下别名为“fortunes”的 bash 脚本:

#!/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操作均按预期进行;但是,在脚本运行时按箭头键不会执行任何操作。

(在我有历史命令之前,它会循环浏览运行脚本之前的 bash 历史记录。)

有没有什么方法可以让它工作?

(我怀疑发生的情况是,bash 直到脚本完成才更新历史记录,这意味着没有解决方案......)

答案1

我让它工作

  • 创建清除历史文件
  • 将每个历史命令附加到该文件,然后
  • 每次添加命令时从该文件重新加载历史记录:

(空白行修复 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

基本命令是echo $REPLY >> $tmpFile; history -r $tmpFile;

我仍然会感谢任何解释为什么history -s $REPLY;它不起作用(它在脚本之外起作用);感觉就像是一个错误,但同时发现了一个错误bash bash!) 看起来几乎有些傲慢 :D

相关内容