Может ли автозаполнение bash охватывать знак равенства

Мне интересно, можно ли сделать так, чтобы автозаполнение включало знак =. Итак, например, я хочу ввести foo BAR=[TAB][TAB] и заполнить возможные значения для BAR. Я пробовал следующее: у меня есть файл с именем «bar», как показано ниже:

#!/bin/bash
echo -e "BAR=100\nBAR=110\nBAR=200" | grep "^$2"

И тогда я делаю:

~> complete -C bar foo

Если я наберу foo [TAB][TAB], это даст мне несколько возможных значений для BAR. Если я наберу foo BAR=[TAB][TAB], произойдет сбой (добавится BAR=BAR= в конец команды). (обратите внимание, если я наберу bar 1 BAR=, это даст мне правильный список завершений, так что это не проблема со скриптом панели).

Это было бы очень полезно для некоторых сценариев, которые у меня есть.


person John    schedule 16.09.2014    source источник
comment
Я не уверен, что именно вы имеете в виду, но, насколько я могу судить, ответ на ваш вопрос, вероятно, нет. Было бы полезно, если бы вы четко указали в вопросе, что именно вы пытаетесь сделать и почему это поведение было бы полезно, поскольку в любом случае может быть лучший способ сделать это.   -  person Tom Fenech    schedule 16.09.2014
comment
Я думаю, что это то, для чего предназначен COMP_WORDBREAKS, хотя вы не можете просто изменить это. Итак, вопрос в том, есть ли способы обойти это поведение, как в этот вопрос о :.   -  person Etan Reisner    schedule 16.09.2014
comment
Том: У меня есть довольно сложный make-файл, который принимает один из нескольких файлов конфигурации, расположенных в другом каталоге. Список файлов несколько динамичен, поэтому я не могу создавать правила для каждой цели. Вместо этого цель указывается в строке make: make target=.... Было бы неплохо иметь это автозаполнение. Есть также несколько других макросов, которые можно установить, и было бы неплохо иметь автозаполнение для них.   -  person John    schedule 17.09.2014
comment
ПОЧТИ там ... если = рассматривается как разрыв слова, я подумал, что могу проверить предыдущее слово и посмотреть, является ли оно BAR, и автозаполнение на основе этого ... только после первого символа после знака = $3 становится = вместо BAR... мля!   -  person John    schedule 17.09.2014


Ответы (1)


Создайте функцию (например, в вашем .bashrc):

bar()
{
  local POS=${COMP_WORDS[COMP_CWORD]}
  if [ "${COMP_WORDS[1]}" = "BAR" ] && [ $COMP_CWORD -eq 3 ]; then
    COMPREPLY=($(echo -e "100\n110\n200" | grep ^$POS ))
  fi
}

и связать функцию с командой foo:

complete -F bar foo
person Cyrus    schedule 16.09.2014
comment
Это работает, только кажется, что он изменяет глобальный COMP_WORDBREAKS, что, как я беспокоюсь, может отрицательно сказаться на других приложениях. - person John; 17.09.2014
comment
Я обновил свой ответ. Недостаток: вы должны ввести хотя бы один допустимый символ после =. - person Cyrus; 17.09.2014