gpt4 book ai didi

bash - 如何自动完成别名为单个命令的多级命令?

转载 作者:行者123 更新时间:2023-11-29 09:05:50 25 4
gpt4 key购买 nike

假设我有两个 bash 函数:

dock() { sudo docker $@ ;}

dock-ip() { sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' $@ ;}

如何让 bash 自动完成与第二个函数一起工作?

使用第一个,就像添加一样简单:

_completion_loader docker; complete -F _docker dock

这不适用于第二个。 Docker 的自动完成源位于 Debian Stretch 上的 /usr/share/bash-completion/completions/docker 中。我有更多函数,例如 dock-rundock-exec 等,所以我不想为每个函数编写自定义完成函数。

此外,complete -F _docker_container_inspect dock-ip 仅部分有效; tab 只列出容器,不补全部分字符串。


研究:

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 完成经验,我拆解了 docker 完成脚本 (/usr/share/bash-completion/completions/docker) 和 bash_completion.sh 脚本来提供一个包装函数:

# Usage:
# docker_alias_completion_wrapper <completion function> <alias/function name>
#
# Example:
# dock-ip() { docker inspect --format '{{ .NetworkSettings.IPAddress }}' $@ ;}
# docker_alias_completion_wrapper __docker_complete_containers_running dock-ip
function docker_alias_completion_wrapper {
local completion_function="$1";
local alias_name="$2";

local func=$(cat <<EOT
# Generate a new completion function name
function _$alias_name() {
# Start off like _docker()
local previous_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

...

请务必在您的配置文件别名脚本顶部调用 _completion_loader docker; 以加载主要的 Docker 完成脚本。请邀请更多熟练的 bash 程序员来改进这个答案。

关于bash - 如何自动完成别名为单个命令的多级命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47781631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com