我正在实现类似于MySQL客户端/usr/bin/mysql
的交互式bash脚本。在这个脚本中,我需要发出各种类型的“命令”。我还需要提供一种历史机制,用户可以使用上/下箭头键滚动到目前为止输入的命令。
此处列出的代码段(Example 15-6, Detecting the arrow keys)并不完全符合我的要求。我真的想要以下内容:
上/下箭头键应以静音模式运行。意思是,它们不应该在终端上回显它们的字符代码。
但是其他键(将用于读取命令名称及其参数)不得以静默模式运行。
read -s -n3
的问题在于它不能满足我同时对静音模式和回声模式的冲突要求,仅基于字符代码。此外,值-n3
将适用于箭头键,但对于其他/常规键,它将不会“返回控制”到调用程序,直到消耗了3个字符。
现在,我可以尝试-n1
并手动组装输入,一次一个字符(哎呀!)。但基于字符代码的静音/回声模式切换问题仍然存在!
有人在bash中试过这件事吗? (注意:我不能使用C,也不能使用Perl,Python等其他脚本语言。)
修改
继续Dennis的回答......你还需要手动通过history -s
将您想要的条目添加到您的历史记录中,就像这样......
while read -e x; do
history -s "$x"
# ...
done
答案 0 :(得分:4)
您可以使用read -e
让read
使用readline
。它将处理您的光标键并为您维护历史记录。您还需要通过history -s
手动将所需条目添加到历史记录中,如下所示:
while read -e x; do
history -s "$x"
# ...
done
答案 1 :(得分:2)
答案 2 :(得分:2)
rlwrap有一个特殊的“一次性”模式,可以替代“read”shell命令。如果您愿意,可以在脚本中每次出现此命令都有自己的历史记录和完成词列表。
像这样使用:
REPLY=$(rlwrap -o cat)
或指定历史文件和完成词表:
REPLY=$(rlwrap -H my_history -f my_completions -o cat)