Завершение команды Muti word для bash

Возможный дубликат:
Правильная обработка пробелов и кавычки в завершении bash

Я хотел бы использовать строки с кавычками muti-word для завершения bash.

например мне нравится быть в состоянии сделать это

$ command <tab> 
  "Long String 1"
  "Long String 2"

где «Длинная строка 1» и «Длинная строка 2» — это предложения, выдаваемые при нажатии табуляции.

Я пытался использовать это, где ~/strings содержит список строк в кавычках

function _hista_comp(){
    local curw
    COMPREPLY=()
    curw=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=($(compgen -W '`cat ~/strings`' -- $curw))    
    return 0
}
complete -F _hista_comp hista

Приведенная выше функция разбивает строку на пробелы. Есть ли способ заставить его вернуть всю цитируемую строку?

например, если ~/string имел следующие строки

  "Long String 1"
  "Long String 2"  

Это дало бы 5 предложений вместо 2.


person Bilal Syed Hussain    schedule 04.05.2012    source источник
comment
Похоже на дубликат stackoverflow.com/questions/1146098/. И ответ, кажется, заключается в том, что compgen плохо работает с пробелами.   -  person Mark Reed    schedule 04.05.2012


Ответы (1)


Попробовав разные вещи, я обнаружил, что добавление

    IFS=$'\x0a';

в начало функции (меняет разделитель ввода на новую строку) заставляет функцию правильно обрабатывать пробелы.

Таким образом, функция будет

function _hista_comp(){  
    IFS=$'\x0a';
    local curw
    COMPREPLY=()
    curw=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=($(compgen -W '`cat ~/strings`' -- $curw))    
        uset IFS
    return 0
}
complete -F _hista_comp hista

Это позволит

$ command <tab> 
  "Long String 1"
  "Long String 2"

как я хотел.

person Bilal Syed Hussain    schedule 04.05.2012
comment
Или, проще говоря, IFS=$'\n'. Кстати, функция в вашем ответе идентична функции в вашем вопросе (кажется, вы забыли добавить строку IFS — я бы тоже сделал local). - person Dennis Williamson; 04.05.2012