Answers:
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 readline功能,其中历史记录由—提供并存储在—中 ~/.myscript_history
。根据需要进行调整。
另外,您可以使用bash的read -e
,它启用了readline的read
调用,但是您可能会发现其历史记录功能太有限(即几乎不存在)。
要从此旧邮件列表帖子中复制Mike Stroyan的出色答案:
您可以使用“ history -r”将文件读入Shell的历史记录,并使用“ history -s”将读入的每一行添加到历史记录中。然后,使用history -w将历史记录保存回文件。这是vi样式阅读行编辑的示例。
#!/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
rlwrap
(至少在我的机器上)rlwrap
无法正常处理CTRL-C,例如,尝试运行USERINPUT=$(rlwrap -o cat)
并按CTRL-C,然后查看终端的行为(运行reset
命令以再次返回正常状态) 。