我已经在 stackoveflow 上问过这个问题,但没有得到任何答复,也很少有意见。我想我应该在这里发帖,因为应该有更多的 bash 用户,并且有人可能已经偶然发现了这个问题。根据SO元,只要我链接到跨网站帖子应该就可以了。如果我错了请告诉我,我会删除这个问题。
我尝试通过将自定义脚本绑定到键ksh
来实现路径自动完成的一些功能。bash
为此,我的脚本从bind
变量中读取信息$READLINE_LINE
并$READLINE_POINT
尝试更新这些值。虽然我可以毫无问题地读取行缓冲区,但我似乎无法修改这些变量并更新当前行。
引用绑定手册页,这应该可以工作:
执行 shell 命令时,shell 将 READLINE_LINE 变量设置为 readline 行缓冲区的内容,并将 READLINE_POINT 变量设置为插入点的当前位置。如果执行的命令更改了 READLINE_LINE 或 READLINE_POINT 的值,这些新值将反映在编辑状态中
我将我的脚本与bind -x '"\t":autocomplete.sh'
, 并做了类似的事情:
#!/bin/bash
#autocomplete.sh
echo $READLINE_LINE $READLINE_POINT #I can read the current line values
EXPANSION=($(magical_autocomplete $READLINE_LINE))
#we store the desired value for the line in ${EXPANSION[0]}
[[ ${#EXPANSION[@]} -gt 1 ]] && echo ${EXPANSION[@]:1} #we echo the match if there are more than 1
READLINE_LINE=${EXPANSION[0]}
READLINE_POINT=${#READLINE_LINE}
#echo READLINE_LINE READLINE_POINT echoes the correct values found by magical_autocomplete
#however the current line & the current point is not updated
当我回显一些信息时,我不能将脚本的输出重定向到调用$READLINE_LINE
中bind
。为什么我可以读取变量但不能写入变量?
答案1
出于同样的原因,这不起作用:
$ export a=1
$ bash -c 'echo $a; let a++'
1
$ echo $a
1
环境变量是遗传,不可共享。由于autocomplete.sh
作为新的子进程执行,因此它可以读取所有父进程的变量,但无法推回新值。
要修改READLINE_LINE
,READLINE_POINT
您必须在同一过程中执行自动完成 -source
函数将为您提供帮助。
# autocomplete.sh
# should be sourced from ~/.bashrc or something
autocomplete() {
echo $READLINE_LINE $READLINE_POINT
EXPANSION=($(magical_autocomplete $READLINE_LINE))
#we store the desired value for the line in ${EXPANSION[0]}
[[ ${#EXPANSION[@]} -gt 1 ]] && echo ${EXPANSION[@]:1}
READLINE_LINE=${EXPANSION[0]}
READLINE_POINT=${#READLINE_LINE}
}
捆绑:
if [[ -s "$HOME/.bashrc.d/autocomplete.sh" ]]; then
source "$HOME/.bashrc.d/autocomplete.sh"
bind -x '"\t" : autocomplete'
fi