如何在Bash的read命令启动时设置Readline初始光标位置?
解决Bash read命令启动时自动设置光标初始位置的问题
直接设置READLINE_POINT无效的原因是:该变量是readline运行时的内部状态变量,仅在readline的上下文(如绑定的函数、宏)中生效,read命令启动时的初始化过程会覆盖提前设置的值。
以下是两种可行的解决方案:
方案一:后台进程触发绑定宏
通过绑定一个设置光标位置的宏,再用后台进程向终端发送触发按键,确保readline初始化后执行宏:
#!/usr/bin/env bash x()( # 绑定Ctrl+k触发光标定位到位置4的宏 bind '"\C-k": "READLINE_POINT=4\n"' # 后台进程延迟发送Ctrl+k(极短延迟确保readline已加载) (sleep 0.001; printf '\C-k' > /dev/tty) & # 启动带初始文本的read命令 read -rei 0123456789 ) x
方案二:进程替换触发绑定函数(更可靠)
利用进程替换给read提供输入,先发送触发字符执行绑定的函数,无需依赖sleep:
#!/usr/bin/env bash x()( # 定义设置光标位置的函数,完成后解绑避免重复触发 set_cursor_pos() { READLINE_POINT=4 bind -r "\C-t" } # 将函数绑定到Ctrl+t bind -x '"\C-t": set_cursor_pos' # 进程替换:先发送Ctrl+t触发函数,再读取终端输入 read -rei 0123456789 < <(printf '\C-t'; cat) ) x
方案二中,read先处理进程替换输出的\C-t字符,执行set_cursor_pos函数完成光标定位,之后cat会继续读取终端输入,用户可以正常编辑内容。
内容的提问来源于stack exchange,提问作者Alberto Millán
相关产品推荐
相关产品推荐

