假设我有两个bash函数:
dock() { sudo docker $@ ;}
@H_301_8@和
dock-ip() { sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' $@ ;}
@H_301_8@使用第一个,就像添加一样简单:
_completion_loader docker; complete -F _docker dock
@H_301_8@这不适用于第二个. Docker的自动完成源位于Debian Stretch上的/usr/share / bash-completion / completions / docker中.我有更多函数,如dock-run,dock-exec等,所以我不想为每个函数编写自定义完成函数.
另外,完成-F _docker_container_inspect dock-ip只能部分工作;选项卡仅列出容器,而不是完成部分字符串.
研究:
How do I autocomplete nested,multi-level subcommands?< - 需要自定义功能 https://superuser.com/questions/436314/how-can-i-get-bash-to-perform-tab-completion-for-my-aliases< - 仅针对顶级命令自动执行
最佳答案
随着bash补经验结合小时,我把除了泊坞窗完成脚本(在/ usr /共享/ bash的完成/完井/泊坞窗)和bash_completion.sh脚本拿出一个包装函数:
# Usage: # docker_alias_completion_wrapper
@H_301_8@IoUs_extglob_setting=\$(shopt -p extglob); shopt -s extglob; # Populate \$cur,\$prev,\$words,\$cword _get_comp_words_by_ref -n : cur prev words cword; # Declare and execute declare -F $completion_function >/dev/null && $completion_function; eval "\$prevIoUs_extglob_setting"; return 0; }; EOT ); eval "$func"; # Register the alias completion function complete -F _$alias_name $alias_name } export -f docker_alias_completion_wrapper 然后我创建了我的别名/函数,如下所示:
# Get container IP dock-ip() { docker inspect --format '{{ .NetworkSettings.IPAddress }}' $@ ;} docker_alias_completion_wrapper __docker_complete_containers_running dock-ip # Execute interactive container dock-exec() { docker exec -i -t --privileged $@ ;} docker_alias_completion_wrapper __docker_complete_containers_all dock-exec ...
@H_301_8@一定要调用_completion_loader docker;在配置文件的顶部使用别名脚本来加载主Docker完成脚本.我邀请更多熟练的bash程序员来改进这个答案.