bash автодополнение с именами файлов

Я не могу заставить работать простую функцию автозаполнения bash. Мне нужно автозаполнять имена файлов из предопределенного каталога, чтобы это выглядело так:

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

Где находятся файлы из /var/log/app.


person jackhab    schedule 12.06.2012    source источник


Ответы (3)


Я не вижу смысла использовать ls, когда оболочка сама по себе может перечислять файлы, поэтому здесь используется только оболочка.

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

Поместите их в ~/.bashrc

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

Чтобы написать полнофункциональную функцию автозаполнения,
взгляните на /etc/bash_completion.d/python.

person kev    schedule 12.06.2012
comment
ls не нужен и не предназначен для такого использования. _cmd() { COMPREPLY=(/var/log/app/*); } - person Dennis Williamson; 12.06.2012
comment
Он показывает список файлов в /var/log/app, но когда я набираю букву, чтобы сузить варианты завершения, а затем нажимаю TAB, буква удаляется, а завершение возвращается к исходному списку файлов. См. i.imgur.com/9TPMs.gif. - person jackhab; 12.06.2012

Я обнаружил, что это работает по мере необходимости:

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

Спасибо собачьему проклятию в https://unix.stackexchange.com/questions/28283/autocomplete-of-filename-in-directory !

person jackhab    schedule 12.06.2012
comment
Это решение, написанное здесь, не сработало для меня, но сработало решение в связанном вопросе. Это просто вопрос правильной настройки $cur. - person MadEmperorYuri; 10.05.2018