因此,我有以下别名为“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