问题描述
当我使用svn
这样的程序时,我在Gnome Terminal中输入:
svn upd
并打Tab
它自动完成:
svn update
是否有可能在我的自定义bash脚本中做这样的事情?
最佳解决方法
您可以使用Programmable Completion。例如,请查看/etc/bash_completion
和/etc/bash_completion.d/*
。
次佳解决方法
我迟了六个月,但我正在寻找同样的事情,并发现这一点:
你将不得不创建一个新文件:
/etc/bash_completion.d/foo
对于静态自动完成(例如--help
/--verbose
),添加以下内容:
_foo()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help --verbose --version"
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _foo foo
-
COMP_WORDS
是包含当前命令行中所有单个单词的数组。 -
COMP_CWORD
是包含当前光标位置的单词的索引。 -
COMPREPLY
是Bash读取可能的完成数组的变量。 compgen -W“–help –verbose –version” – “”
此命令返回与当前字"${cur}"
匹配的--help
,--verbose
和--version
中的元素数组
来源:http://www.debian-administration.org/articles/316
第三种解决方法
这是一个完整的教程。
让我们有一个名为admin.sh的脚本示例,您希望自动完成工作。
#!/bin/bash
while [ $# -gt 0 ]; do
arg=$1
case $arg in
option_1)
# do_option_1
;;
option_2)
# do_option_1
;;
shortlist)
echo option_1 option_2 shortlist
;;
*)
echo Wrong option
;;
esac
shift
done
注意选项短名单。使用此选项调用脚本将打印出此脚本的所有可能选项。
在这里你有自动完成脚本:
_script()
{
_script_commands=$(/path/to/your/script.sh shortlist)
local cur
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )
return 0
}
complete -o nospace -F _script ./admin.sh
请注意,要完成的最后一个参数是要添加自动完成的脚本的名称。您只需将自动完成脚本添加到bashrc中即可
source /path/to/your/autocomplete.sh
或将其复制到/etc/bash.completion.d
第四种方法
如果你想要的只是一个简单的基于auto-completion的单词(因此没有子命令完成或任何其他),complete
命令有一个-W
选项,只是做正确的事情。
例如,我的.bashrc
中有以下行来自动完成名为jupyter的程序:
# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'
现在jupyter <TAB> <TAB>
自动为我完成。
gnu.org上的docs很有帮助。
它似乎依赖于正确设置IFS
变量,但这对我没有任何问题。
要添加文件名完成和默认BASH完成,请使用-o
选项:
complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'
要在zsh中使用它,请在~/.zshrc
中运行complete
命令之前添加以下代码:
# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
autoload bashcompinit
bashcompinit
fi