【问题标题】:bash autocompletion with file names带有文件名的bash自动完成
【发布时间】:2012-06-15 03:35:29
【问题描述】:

我无法使用简单的 bash 自动完成功能。我需要从预定义的目录中自动完成文件名,所以它看起来像这样:

$ cmd log<TAB><TAB>
file1.log file2.log file3.log   

文件来自/var/log/app

【问题讨论】:

    标签: bash autocomplete bash-completion


    【解决方案1】:

    当 shell 可以单独列出文件时,我看不出使用 ls 的意义,所以这里只使用 shell。

    _cmd() {
        local files=("/var/log/app/$2"*)
        [[ -e ${files[0]} ]] && COMPREPLY=( "${files[@]##*/}" )
    }
    complete -F _cmd cmd
    

    【讨论】:

      【解决方案2】:

      我发现这可以根据需要工作:

      COMPREPLY=( $(compgen -W "$(ls /var/log/app/)" -- $cur) )
      

      感谢 https://unix.stackexchange.com/questions/28283/autocomplete-of-filename-in-directory 中的 dogbane!

      【讨论】:

      • 这里写的这个解决方案对我不起作用,但链接问题中的解决方案对我有用。这只是正确设置$cur的问题。
      【解决方案3】:

      将它们放入~/.bashrc

      _cmd() { COMPREPLY=($(ls /var/log/app)); }    
      complete -F _cmd cmd
      

      要编写一个功能齐全的自动完成功能,
      请看/etc/bash_completion.d/python

      【讨论】:

      • ls 不是必需的,也不打算以这种方式使用。 _cmd() { COMPREPLY=(/var/log/app/*); }
      • 它确实显示了 /var/log/app 中的文件列表,但是当我键入一个字母以缩小完成选择然后按 TAB 时,该字母被删除并且完成返回到原始文件列表.见i.imgur.com/9TPMs.gif
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 2012-04-09
      • 1970-01-01
      相关资源
      最近更新 更多