linux下命令自动补全总结

很多命令都会提供一个bash-complete的脚本,在执行该命令时,敲tab可以自动补全参数,会极大提高生产效率。

linux命令自动补全

centos7下执行yum install bash-completion之后重启系统正常。

docker命令自动补全

yum install docker后,会有一个文件: /usr/share/bash-completion/completions/docker ;
显然,该脚本是用于bash自动补全的,但是,直接 source 执行该脚本后,docker命令后敲tab,会有错误。

yum install -y bash-completion后就可以解决。

kubectl命令自动补全

kubectl这个命令行工具非常重要,与之相关的命令也很多,我们也记不住那么多的命令,而且也会经常写错,所以命令自动补全是非常有必要的,kubectl命令行工具本身就支持complication,只需要简单的设置下就可以了。以下是linux系统的设置命令:

source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

 python shell自动命令补全

  1. 创建文件 .pythonrc, 添加如下内容

    import rlcompleter, readline
    readline.parse_and_bind('tab:complete')
    
  2. .bashrc 文件尾追加如下内容

     export PYTHONSTARTUP=~/.pythonrc
    
  3. 更新环境变量 source ./.bashrc

shell命令补全

在shell命令行可以使用“Tab”键自动补全命令或文件名,这种功能其实可以在shell脚本中实现,使得使用“Tab”键可以自动补全自定义的shell函数,相关命令有三个,compgen、complete和compopt。

1、compgen

compgen [option] [word]

compgen命令根据option生成与word可能匹配的补全,并打印到标准输出中,这些选项可以是内建命令complete所支持的任何选项,但不能是“-p”和“-r”,如果使用了“-F”或“-C”,则由可编程补全功能设置的各个shell变量虽然仍可以使用,但它们的值却没什么作用。补全条目以相同的方式生成,就好像可编程补全代码用相同的补全选项直接生成了补全条目一样,如果指定了word,则只显示与之匹配的条目。

2、complete

complete [-abcdefgjksuv] [-o comp-option] [-DE] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] name [name ...]
complete -pr [-DE] [name ...]

complete命令指定如何对各个名称进行补全。如果指定了选项“-p”或者没有指定任何选项,则把已有的补全方法用一种可以重新作为作为输入的格式打印出来。选项“-r”用以删除指定名称的补全方法,不指定名称时删除所有的名称的补全方法。选项“-D”的意思是其后的选项和动作将应用到默认命令补全,也就是说之前未定义的补全命令也可以补全。选项“-E”的意思是其后的选项和动作将应用到空命令补全,也就是说补全空白行。对于选项“-G”、“-W”、“-X”、“-P”和“-S”,应该使用括号进行保护,防止补全开始前被扩展。

“-o bashdefault”:如果没有生成补全条目,就使用bash默认的其它补全。
“-o default”:如果没有生成补全条目,就使用“readline”默认的文件名补全。
“-o dirnames”:如果没有生成补全条目,就进行目录名补全。
“-o filenames”:告诉“readline”生成文件名,以便进行与文件名相关的处理,例如在目录名后面加上斜杠,引用特殊字符,去掉行尾的空格,目的是用于shell函数。
“-o noquote”:告诉“readline”不引用文件名,默认会进行引用。
“-o nospace”:告诉“readline”在补全的名称后不添加空格,默认添加空格。
“-o plusdirs”:生成补全条目之后,还会进行目录名补全并把结果添加到其它动作得到的结果中。
“-A alias”:别名,同选项“-a”。
“-A arrayvar”:数组变量名。
“-A binding”:“readline”键绑定名。
“-A builtin”:shell内建命令名,同选项“-b”。
“-A command”:命令名,同选项“-c”。
“-A directory”:目录名,同选项“-d”。
“-A disabled”:不可用的shell内建命令名。
“-A enabled”:可用的shell内建命令名。
“-A export”:导出的shell变量名,同选项“-e”。
“-A file”:文件名,同选项“-f”。
“-A function”:shell函数名。
“-A group”:组名,同选项“-g”。
“-A helptopic”:内建命令help支持的帮助主题。
“-A hostname”:主机名,从shell环境变量HOSTFILE中获取。
“-A job”:作业名,同选项“-j”。
“-A keyword”:shell保留字,同选项“-k”。
“-A running”:正在运行的作业名。
“-A service”:服务名,同选项“-s”。
“-A setopt”:内建命令set的选项“-o”可用的参数。
“-A shopt”:内建命令shopt可接受的选项名。
“-A signal”:信号名。
“-A stopped”:暂停的作业名。
“-A user”:用户名,同选项“-u”。
“-A variable”:所有的shell变量名,同选项“-v”。
“-C command”:在子shell中执行命令,并把其结果作为补全条目。
“-F function”:在当前的shell环境中执行函数function,执行时,参数“$1”表示那个参数正在进行补全的命令名,参数“$2”表示补全的名称,参数“$3”表示补全的名称前面的单词,表示结束执行时,从数组变量COMPREPLY中获取补全条目。
“-G globpat”:使用文件名扩展模式globpat进行扩展以生成可能的补全条目。
“-P prefix”:在所有的选项应用到补全结果后,在结果前添加前缀prefix。
“-S suffix”:在所有的选项应用到补全结果后,在结果后添加后缀suffix。
“-W wordlist”:使用特殊变量IFS中的字符拆分单词列表wordlist,并扩展拆分后的每个单词,结果中与待补全单词
匹配的条目就是补全条目。
“-X filterpat”:filterpat是进行文件名扩展时使用的模式,它作用于通过前面的选项和参数生成的补全列表,并把每个与过滤模式匹配的条目删除,模式中前导的叹号表示否定,这时会删除与过滤模式不匹配的条目。

3、compopt

compopt [-o option] [-DE] [+o option] [name]

compopt命令修改每个名称指定的补全选项,如果没有指定名称则修改当前执行的补全的选项,如果也没有指定选项,则显示每个名称或当前补全所用的选项。选项可能的取值就是上面的内建命令complete的有效选项。

4、相关变量

除了命令compgen、complete和compopt之外,shell命令行自动补全还要用到一些shell自带的变量,如下。

COMP_CWORD:在包含当前光标位置的单词“${COMP_WORDS}”中的下标,这个变量只能在可编程补全的shell函数中使用。
COMP_LINE:当前命令行,这个变量只能在可编程补全的shell函数中使用。
COMP_POINT:当前光标位置相对于当前命令行开头的下标,如果当前光标位置在当前命令行的尾部,则这个变量的值就与“${#COMP_LINE}”相同,这个变量只能在可编程补全的shell函数中使用。
COMP_TYPE:一个整数值,与触发调用补全函数时试图进行补全的类型相对应,正常补全为“TAB”,连续输入制表符后的补全列表为“?”,列出其它部分补全条目为“!”,没有修改单词而列出补全条目为“@”,补全菜单为“%”,这个变量只能在可编程补全的shell函数中使用。
COMP_KEY:触发当前补全函数的键,或键序列中的最后一个键。
COMP_WORDBREAKS:“readline”库进行单词补全时用作单词分隔的字符,如果没有设置这个变量,即使以后进行重置,它也会失去特殊作用。
COMP_WORDS:一个数组变量,包含当前命令行的每个单词,与“readline”一样当前行被COMP_WORDBREAKS拆分成单词,这个变量只能在可编程补全的shell函数中使用。
COMPREPLY:一个数组变量,bash从这个变量中读取可编程补全所调用的shell函数生成的补全条目。

5、例子

测试脚本如下:

function autotab() {
    echo "function autotab called $@"
}
autotab_list=("aa" "bb" "cc" "dd" "123")
function _autotab() {
    local cur
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    COMPREPLY=( $(compgen -W "${autotab_list[*]}" -- ${cur}) )
    return 0
}
complete -F _autotab autotab

例子中,在shell命令行执行命令autotab时,如果命令未输完,按下Tab键就会补全这个命令,而且还会显示或补全一些参数,这些都是通过命令complete及函数_autotab完成的,数组autotab_list的各元素扩展为命令的参数。

Docker在Linux系统中通常提供了一套方便的命令行工具,其中包含一系列用于管理容器、镜像等操作的命令。为了提高效率,许多Linux发行版的Docker客户端支持自动补全功能。要在Linux Docker命令行中启用自动补全,你可以按照以下步骤操作: 1. **基于bash shell**: - 如果你的shell是bash,可以安装`docker-compose-completion`或者`docker-machine-completion`,这两个包通常会提供基本的Docker命令补全。 ``` sudo apt-get install docker-compose-completion # 对于docker-compose sudo apt-get install docker-machine-completion # 对于docker-machine ``` - 配置bash自动加载补全脚本: ```bash if [ -f /usr/share/bash-completion/completions/docker ]; then source /usr/share/bash-completion/completions/docker fi ``` 2. **基于zsh shell**: - Zsh用户需要安装`oh-my-zsh`插件,并从其plugins目录添加`docker`补全。 ```bash git clone https://github.com/zsh-users/zsh-autocompletion.git ~/.oh-my-zsh/custom/plugins/docker echo "plugins=(docker)" >> ~/.zshrc zsh ``` - 然后配置zsh加载`docker`补全: ```bash autoload -Uz compinit && compinit ``` 3. **手动设置**: - 如果上述方法都不适用,你也可以手动编辑`.bashrc`或`.zshrc`文件,添加`source <path_to_docker_completion_file>`,例如对于官方Docker CLI,路径可能是`/usr/local/etc/bash_completion.d/docker`. 在完成以上设置后,你应该能在终端中使用Docker命令时享受自动补全的功能了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菲宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值