bash – 具有等号的完整命令选项
我正在尝试为命令编写一个
Bash完成脚本,该命令可以在表单–option或–param = value上使用长选项.如果用户已在命令行中输入了一个选项,则应从完成列表中排除该选项(假设在命令行上指定给定选项一次才有意义).
这是第一次尝试: _myprog() { local cur="${COMP_WORDS[$COMP_CWORD]}" local words=(--help --param1= --param-state --param2=) _exclude_cmd_line_opts COMPREPLY=( $(compgen -W "${words[*]}" -- "$cur") ) } complete -F _myprog myprog _exclude_cmd_line_opts() { local len=$(($COMP_CWORD - 1)) local i for i in "${COMP_WORDS[@]:1:$len}" ; do [[ $i == --* ]] && words=( "${words[@]/$i}" ) done } 如果源脚本源脚本.sh然后写: $myprog --param1= <tab><tab> 我得到以下完成列表: = --help --param2= --param-state 所以它几乎可以工作除了我在完成列表中得到一个虚假的’=’标志..有什么建议吗? 解决方法
在命令行中输入等号会因COMP_WORDBREAKS的默认内容而导致单词中断.效果似乎是等号在COMP_WORDS中作为单独的单词输入.这在_exclude_cmd_line_opts的以下修改中被利用:
_exclude_cmd_line_opts() { local len=$(($COMP_CWORD - 1)) local i for ((i=1 ; i<=len; i++)) ; do local j="${COMP_WORDS[$i]}" if [[ $j == --* ]] ; then (( i<len )) && [[ ${COMP_WORDS[$(( i + 1))]} == '=' ]] && j="$j=" words=( "${words[@]/$j}" ) fi done } 原始版本的_exclude_cmd_line_opts的问题是${words [@] / $j}会给出一个假的=例如words =(param1 =)和j =“param1”(请注意$j中缺少的尾随等号)这是由COMP_WORDBREAKS引起的..) 更新 我发现了另一个特点.以上案例工作正常,因为我从来没有输入< tab>在=符号后立即.但是,如果例如words =( – param = –param-info),我输入–par< tab>仍然有两个候选人完成,目前的单词只是部分完成成为–param.在此,我想选择两个候选中的第一个,并在命令行上键入一个显式=符号,然后键入< tab>现在发生的事情是Bash认为你输入了一个空格(因为COMP_WORDBREAKS包含=),当前完成字从–param =变为=.这再次,将使Bash readline省略插入通常的空间,因此用户被迫键入空格以继续完成下一个选项. 通过返回带有空字符串的COMPREPLY数组,可以避免在上述情况下键入空格. _myprog() { local cur="${COMP_WORDS[$COMP_CWORD]}" local prev="" (( COMP_CWORD > 0 )) && prev="${COMP_WORDS[$(( COMP_CWORD - 1))]}" [[ $cur == '=' && $prev == --* ]] && { COMPREPLY=( "" ); return; } local words=(--param= --param-info) _exclude_cmd_line_opts COMPREPLY=( $(compgen -W "${words[*]}" -- "$cur") ) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 大数据量(16M)的DataSet压缩方法比较
- 实战WebService II: SOAP篇(基于php)
- bash – 你能解释一下这个#ln -s:“target不是目录”吗?
- scala – 什么是List [String~Int]?
- scala – 如何使用Slick代码生成器来包含数据库视图?
- scala – Spark数据帧将列值转换为字符串变量
- bootstrap3 自定义button主题
- angularjs – Angular UI Router – 如何在代码中使用$uiVi
- angularjs – 使用资源服务时如何传递参数?
- scala – Spark-submit ClassNotFound异常