我创建了很多小脚本来帮助我日常生活。我想为它们提供自动完成功能,特别是我打算与人们分享它们。
现在,我知道我可以创建在登录时获取的自动完成功能,但为了优雅和可移植性,我寻求在脚本本身内部提供自动完成功能。
由于我在家里使用 zsh 而在我的 VPS 上使用 bash,所以我希望脚本是可移植的(或者根据 shell 切换行为),但对于任一环境,我已经对一个解决方案感到满意了。
答案1
[F]为了优雅和可移植性,我寻求在脚本本身内部提供自动完成功能。
您不能在 shell 脚本内部执行此操作。
传统上,脚本和二进制文件的 Bash 补全由指定目录中的条目处理(例如,/etc/bash_completion.d
对于/usr/share/bash-completion/completions
Bash)。
但是,这些所做的只是使用适当的参数调用内置命令complete
。首次调用脚本时,您只需在其中一个目录中(需要 root 权限)或在 中进行输入即可~/.bashrc
。
基本语法如下:
# declare function to pass to `complete'
_myscript()
{
# declare variable `cur' (holds string to complete) as local
local cur
# initialize completion (abort on fail)
_init_completion || return
# if string to complete (`cur') begins with `-' (option)
if [[ "$cur" == -* ]] ; then
# complete to the following strings, if they start with `cur`
COMPREPLY=( $( compgen -W '-a -b -c --foo --bar' -- "$cur" ) )
else
# otherwise, complete to elements in current directory that begin with `cur'
_filedir -d
fi
# if declaring the function was successful, use it when the command is `myscript'
} && complete -F _myscript myscript
例如,你可以将上述内容保存到~/.myscript_completion
并附加
source ~/.myscript_completion
到~/.bashrc
。