Bash 3脚本自定义提示符:合并历史记录与自动补全求助
整合Bash 3自定义提示符的自动补全与历史记录功能
以下是适配Bash 3、支持Ubuntu/macOS的整合版代码,同时解决了你原代码中的笔误问题:
#!/bin/bash # 兼容Bash 3,支持Ubuntu/macOS # 定义合法命令列表 readonly VALID_COMMANDS=(car dog dollars quit) # 自定义自动补全函数:生成匹配当前输入的命令候选 _custom_completion() { local cur="${COMP_WORDS[COMP_CWORD]}" COMPREPLY=($(compgen -W "${VALID_COMMANDS[*]}" -- "$cur")) } # 将补全函数绑定到虚拟触发命令(用于触发Bash补全机制) complete -F _custom_completion mycli # 带历史记录和补全的输入处理函数 prompt_input() { local input while true; do # 重置补全状态,确保每次输入的补全新鲜 COMP_LINE="" COMP_POINT=0 # 启用readline支持(方向键调历史、Tab补全),自定义提示符 if IFS= read -er -p "t!care>> " input; then # 将输入添加到会话历史 history -s "$input" echo "$input" return 0 else # 处理Ctrl+D退出 echo "" exit 0 fi done } # 主交互循环 while true; do echo "Menu:" echo "1. car" echo "2. dog" echo "3. dollars" echo "4. Quit" input=$(prompt_input) case "$input" in car) echo "You have selected car." ;; dog) echo "You have selected dog." ;; dollars) echo "You have selected dollars." ;; quit) echo "You have selected quit" exit 0 ;; *) echo "Error command" ;; esac done
关键功能说明
自动补全实现
- 用
complete -F将自定义补全函数绑定到虚拟命令mycli,借助Bash原生补全机制触发候选建议 compgen -W根据合法命令列表生成匹配当前输入的补全选项,完美适配Bash 3read -e启用readline,按下Tab键即可触发补全
- 用
历史记录实现
read -e自带readline历史支持,上下方向键可直接调取会话内的历史输入history -s "$input"将每次输入的命令追加到会话历史,确保后续能调取- 若需要持久化历史(关闭终端后仍保留),可在脚本开头添加
HISTFILE="$HOME/.mycli_history",并在history -s后追加history -a,脚本启动时添加history -r读取历史文件
跨系统兼容性
- 所有语法均兼容Bash 3(macOS默认Bash版本)和更高版本(Ubuntu默认版本)
- 未使用系统特定的非标准命令,确保跨Unix环境运行正常
内容的提问来源于stack exchange,提问作者Doe
相关产品推荐
相关产品推荐

