Linux 自动完成中带有用户定义函数的Bash脚本

Linux 自动完成中带有用户定义函数的Bash脚本,linux,bash,shell,Linux,Bash,Shell,我需要我的bash脚本从用户那里获取函数名。脚本应该通过自动完成同一bash脚本文件中定义的函数来帮助用户 例如: myBash.sh #!/usr/bash function func1() { echo "In func1 func" } function func2() { echo "In func2 func" } function myFunc1() { echo "In myFunc1 func" } while [ 1 ] do echo -

我需要我的bash脚本从用户那里获取函数名。脚本应该通过自动完成同一bash脚本文件中定义的函数来帮助用户

例如:

myBash.sh

#!/usr/bash
function func1()
{
    echo "In func1 func"
}

function func2()
{
    echo "In func2 func"
}

function myFunc1()
{
    echo "In myFunc1 func"
}

while [ 1 ]
do
    echo -n "cmd>"
    read $userCmd
    $userCmd
done

]$ ./mybash.sh
cmd> my<tab><tab>
myFunc1

cmd> func<tab><tab>
func1 func2
#/usr/bash
函数func1()
{
回显“在func1 func中”
}
函数func2()
{
回显“在func2 func中”
}
函数myFunc1()
{
回显“在myFunc1 func中”
}
而[1]
做
echo-n“cmd>”
读取$userCmd
$userCmd
完成
]$./mybash.sh
cmd>我的
myFunc1
cmd>func
职能1职能2
这是我需要的输出。
如何进行此操作?

此解决方案应能解决此问题

#/bin/bash
func1(){
echo“您在功能1:$@”
}
func2(){
echo“您在func2:$@”
}
myFunc1(){
echo“您在myFunc1:$@”
}
#使用:自动完成“word1 word2…”
自动完成(){
#我们只会尝试自动完成最后一个单词,所以我们会保留其余输入的记录
OTHER_WORDS=“${READLINE_LINE%*}”
如果[${OTHER#uWords}-ge${{READLINE_LINE}];那么#如果只有一个单词。。。
OTHER_WORDS=“”
fi
#-W标志告诉compgen从提供的第一个参数读取autocomplete
#然后,我们通过compgen评估当前行的最后一个字
自动完成=($(compgen-W$1“${READLINE###*}”)
如果[${#AUTOCOMPLETE[@]}==1]];那么#如果只有1个匹配项,我们将替换。。。
READLINE_LINE=“$OTHER_WORDS${AUTOCOMPLETE[0]}”
READLINE_POINT=${READLINE_LINE}我们将光标设置在单词的末尾
其他的
echo-e“cmd>$READLINE\n${AUTOCOMPLETE[@]}”#…否则我们将打印可能性
fi
}
MYFUNC=“func1 func2 myFunc1”#这里我们列出了允许自动完成的值
set-o emacs#我们这样做是为了启用行编辑
bind-x''s\t:“自动完成\$MYFUNC'”#按TAB键时调用自动完成
读取时-ep“cmd>”;做
历史-s$REPLY#历史只是一笔不错的奖金
eval${REPLY}
完成
要尝试它:

]$ ./mybash.sh
cmd> my<tab>
cmd> myFunc1

cmd> func<tab>
func1 func2

cmd> func1 hello, world!
You are in func2: hello, world!

cmd> func1 my<tab>
cmd> func1 myFunc1
]$./mybash.sh
cmd>我的
cmd>myFunc1
cmd>func
职能1职能2
cmd>func1你好,世界!
你在func2:你好,世界!
cmd>func1我的
cmd>func1 myFunc1

正如我在之前的评论中提到的,请看一看。它使用了一个很好的技巧来自动检测所有内部函数,以便将其用作自动完成值。

半个答案:使用
-e
选项
read
使用
readline
处理输入(包括命令完成)。更难的是让
readline
只使用本地定义的函数作为命令名的潜在补全。显然,这样做真的很痛苦,我不知道中描述的错误是否得到了纠正not@Ploutox-我在找那篇文章,但不记得怎么找。当我试着这么做的时候,那只虫子也咬了我。伟大的发现!