如何read
通过按向上/向下键循环浏览内置命令来支持历史记录?
我尝试过在按下向上键时捕获,但它似乎不适用于read
:
read -p '> ' -n 3 foo
echo
echo -n "$foo" | hexdump
按箭头键似乎有效,我可以使用它检测到它,但是如果我按aa↑,它将失败,因为它只会读取向上箭头标识符的第一个字符,而需要第三个字符来区分不同的箭头键。
答案1
复制 Mike Stroyan 的精彩答案旧邮件列表帖子:
您可以使用“history -r”将文件读入 shell 的历史记录中,并使用“history -s”将您读取的每一行添加到历史记录中。然后使用history -w 将历史记录保存回文件中。这是一个 vi 风格 readline 编辑的示例。
#!/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
答案2
您可以使用rlwrap
为此,如果您不介意安装软件的话。
您可能希望保留一个单独的历史文件,该文件仅维护脚本中特定提示的历史记录(即避免与用户的 shell 命令历史记录混合)。
这是一个可能适合您的示例:
#!/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
在上面的脚本中,用户可以使用所有GNU 阅读线功能,历史记录由 — 提供并存储在 — 中 ~/.myscript_history
。根据需要进行调整。
或者,您可以使用 bash 的read -e
,它支持 readline 调用read
,但您可能会发现它的历史记录功能太有限(即几乎不存在)。