从 bash_completion 中排除特定文件

从 bash_completion 中排除特定文件

我有一个简单的bash_completion代码。它唯一做的事情就是当我输入grcat然后 时Tab,它会提供从/etc/grcat.

_grcat() {
    local word
    COMPREPLY=()
    if [ 1 -eq "$COMP_CWORD" ]; then
      pushd /etc/grcat &>/dev/null || return 1
      word="${COMP_WORDS[COMP_CWORD]}"
      COMPREPLY=($(compgen -f "$word"))
      popd &>/dev/null
    fi
} 
complete -F _grcat grcat

我需要修改它,以便它列出/etc/grcat除 之外的所有文件/etc/grcat/README

我怎样才能bash_completion忽略一个特定的文件?

答案1

您还可以使用-X以下选项compgen

_grcat() {
  local word
  COMPREPLY=()
  if [ 1 -eq "$COMP_CWORD" ]; then
    pushd /etc/grcat &>/dev/null || return 1
    word="${COMP_WORDS[COMP_CWORD]}"
    local filterpat='README'
    COMPREPLY=($(compgen -f -X "$filterpat" -- "$word"))
    popd &>/dev/null
  fi
} 
complete -F _grcat grcat

compgen接受大多数与complete-p和相同的选项-r

compgen还生成结果,将匹配写入标准输出。complete仅存储规则以供将来使用。

答案2

这里,我看到您正在寻找的变量是FIGNORE。您可以执行以下操作:

export FIGNORE=$FIGNORE:/etc/grcat/README

看来您也可以使用Complete命令来完成您想要做的事情。我看到有关Complete命令使用的信息这里这里

您实际上可以尝试修改complete脚本中的命令,例如,

complete -f -X '/etc/grcat/README' grcat

从 的手册页来看complete

-X filterpat filterpat 是用于文件名扩展的模式。它应用于由前面的选项和参数生成的可能完成列表,并且每个
与filterpat匹配的完成都将从列表中删除。领先!在filterpat中否定模式;在这种情况下,任何不匹配 filterpat 的补全都会被删除。

相关内容