加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 17:00:12 所属栏目:安全 来源:网络整理
导读:假设我有两个bash函数: dock() { sudo docker $@ ;} 和 dock-ip() { sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' $@ ;} 如何使用第二个函数进行bash自动完成? 使用第一个,就像添加一样简单: _completion_loader docker; complete -
假设我有两个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-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 <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程序员来改进这个答案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读