2015-04-27 3 views
2

Я обнаружил, что shopt -s nullglob, по-видимому, отключает выполнение табуляции для файлов и каталогов, а shopt -u nullglob восстанавливает его. Почему закрытие табуляции для каталогов, по-видимому, не зависит от nullglob?nullglob disable pathname tab-completion

Я использую Bash 4.2.37(1)-release на Debian 7.

+0

Я не вижу этого здесь. Какая версия bash? Какое распределение? С какой командой вы тестируете это? –

+0

@EtanReisner Различные команды - встроенные функции, такие как 'echo', такие программы, как' ls', aliases .... Я не думаю, что это имеет значение, так как табуляция для путей не является специфичной для команды. Я добавил свою версию Bash и дистрибутив Linux к этому вопросу. –

+1

Завершение табуляции фактически зависит от команды (см. Вывод из 'complete' для получения дополнительной информации об этом). Вы можете легко сломать завершение для определенной команды, не нарушая при этом полного завершения. –

ответ

2

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

Но, видимо, это было именно так, по крайней мере, 2012

См https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=666933 для справки.

Изменить: По крайней мере, 2011: http://thread.gmane.org/gmane.comp.shells.bash.completion.devel/3652

Я не совсем понимаю, как nullglob вызывает проблемы, перечисленные в этом письме, хотя.

Редактировать: Теперь я понимаю, что происходит. Проблема в том, что расширение glob является немым. Он видит всего «слово» $2[$j]=\${!ref}\${COMP_WORDS[i]} как единый глобус и пытается его расширить. Обычно это терпит неудачу, и он остается один, но будет nullglob по этому аргументу просто исчезает (тем самым вызывая проблему).

Быстрое тестирование показывает, что замена этого:

eval $2[$j]=\${!ref}\${COMP_WORDS[i]} 

либо:

eval $2\[$j\]=\${!ref}\${COMP_WORDS\[i\]} 

или:

eval "$2[$j]=\${!ref}\${COMP_WORDS[i]}" 

, кажется, решить эту проблему. Однако я не могу ручаться за то, что это было полностью исправленное решение.

Обновление: Это уже исправлено в репозитории git-завершения для debian bash (в некотором смысле, о котором я не думал, но который явно лучше).

This commit исправляет его. Существуют и другие исправления, связанные с глобированием.

Захват __reassemble_comp_words_by_ref из git head и sourcing, который, в верхней части текущего, кажется, устраняет проблему как временное решение/решение.

+0

Ну, это неутешительно. –

+0

Согласен. Более разочаровывающим является то, что я не видел, чтобы кто-нибудь обсуждал, что может быть на самом деле. Я испытываю соблазн принять отчет из этой второй ссылки и опубликовать ее как вопрос SO, чтобы узнать, может ли кто-нибудь объяснить, что происходит там, так как я этого не понимаю. –

+0

Я видел несколько случаев (я думаю, некоторые из кода завершения git), которые ломаются, потому что он пытается использовать поведение по умолчанию для glob, не понимая, что установлен nullglob. nullglob является * лучше * несколькими способами, но нет ничего плохого в некотором коде, используя old-style-yields-the-wildcard-back-on-fail. ЕСЛИ код локально устанавливает nullglob и восстанавливает его после. Это не то, что происходило. Результат будет аналогичен тому, как IFS используется в подобных случаях. –

Смежные вопросы