Tyi*_*ilo 13 bash command-history readline
如何read通过按向上/向下键循环浏览内置命令支持历史记录?
当你按下向上键时,我试过捕捉,但它似乎不适用于read:
read -p '> ' -n 3 foo
echo
echo -n "$foo" | hexdump
Run Code Online (Sandbox Code Playgroud)
按箭头键似乎有效,我可以使用它检测到它,但是如果我按aa↑,它将失败,因为它只会读取向上箭头标识符的第一个字符,而需要第三个字符来区分不同的箭头键。
小智 14
从这个旧的邮件列表帖子中复制 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
Run Code Online (Sandbox Code Playgroud)
mrb*_*mrb 11
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"
Run Code Online (Sandbox Code Playgroud)
$ ./rlwrap_example.sh
hello
User said hello
Run Code Online (Sandbox Code Playgroud)
在上面的脚本中,用户可以使用所有GNU readline功能,历史从 - 并存储在 - 中 ~/.myscript_history。根据需要调整。
或者,您可以使用 bash 的read -e,它为read调用启用 readline ,但您可能会发现它的历史功能太有限(即几乎不存在)。