如何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,但您可能会发现它的历史记录功能太有限(即几乎不存在)。

相关内容