Как настроить автозаполнение bash для работы с именами файлов, такими как "./foo=bar/x=y.txt"?

Когда я начинаю вводить имя файла со знаком равенства, автозаполнение с помощью [tab] показывает странное поведение:

ls ./foo[tab]    # autocompletion to "./foo\=bar"         <- ok
ls ./foo=[tab]   # autocompletion to "./foo=foo\=bar/"    <- not ok

Что-то, что я могу поместить в.bashrc, чтобы контролировать это поведение или изменить некоторые сценарии автозаполнения в /etc?

bash --version
GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)

1 ответ

Решение

Возможно нет. Или, по крайней мере, это будет действительно сложно. Проблема здесь в том, что foo= bash интерпретирует как попытку установить переменную foo к чему-то. Таким образом, когда вы нажимаете вкладку, он пытается дополнить имена файлов в текущем каталоге. Это на самом деле не завершает foo=, это начинает совершенно новый шар из ничего. Обратите внимание, что для завершения требуется две вкладки foo=,

Чтобы проиллюстрировать это, вы можете увидеть такое же поведение, даже если нет файлов, начинающихся с foo=:

$ ls
bar  baz

Typing foo= и нажатие Tab приводит к:

$ foo= ## first tab does nothing
$ foo= 
bar          baz  ## both file names are printed. 

Я сомневаюсь, что будет какой-то способ обойти это, так как это основная функция оболочки и основной способ определения переменных.

Я могу придумать два обходных пути. Либо сбежать =:

$ ls foo\=  ## hit tab
$ ls foo\=bar 

Или используйте кавычки:

$ ls 'foo=     ## hit tab
$ ls 'foo=bar' ## yes, the final quote is added by the shell. 

Нажатие Tab теперь будет правильно раскрывать имя файла.

Другие вопросы по тегам