3

Если у меня есть следующие файлы в каталоге:

$ ls
a-file-1
b-file-2
something-else

А я типа

$ cat *file*<TAB>

Линия неожиданно обновляется до

$ cat a-file-1 |

(pipe обозначает курсор), хотя glob также соответствует b-file-2 . Немного странно, если я запускаю другую оболочку, вместо этого я получаю список совпадений на двойной вкладке (что я предпочитаю):

$ cat *file*<TAB><TAB>
a-file-1  b-file-2
$ cat *file*|

Q: Как настроено это поведение? Я хотел бы иметь второе поведение в оболочке входа в систему.

Кажется, что оболочки входа в систему получают первое поведение, а оболочки, не входящие в систему, получают второе. Тем не менее, мой ~/.bash_profile делает не больше, чем старт ~/.bashrc . (У меня нет .profile .) Кажется, где-то я как-то меняю конфигурацию.

shopt , что только в оболочке входа в систему extglob on , hostcomplete off и login_shell on но их изменение не меняет вышеуказанное поведение set -o вывод такой же. Попробовал set show-all-if-ambiguous on но это не имело никакого эффекта. Я использую Ubuntu 14.04.1.

Обновление относительно комментария @mpy.

В оболочке без регистрации, когда я включаю базовый каталог в глобус и нажимаю Alt-G, поведение отличается от того, когда я использую TAB TAB. Именно это последнее поведение я хочу настроить в оболочке входа в систему.

Alt - G:

$ ls dir/*file*<Alt-G>

обновления для

$ ls dir/|

удаляя шарик и не печатая спички. Принимая во внимание, что TAB TAB выводит совпадения

$ ls dir/*file*<TAB><TAB>
a-file-1  b-file-2
$ ls dir/*file*|

2 ответа2

3

В дополнение к кавычкам без кавычек, которые упоминал @ peter-cordes, есть еще одна ошибка в функции _filedir():

--- /usr/share/bash-completion/bash_completion--OLD 2015-08-19 19:58:22.734667377 -0500
+++ /usr/share/bash-completion/bash_completion      2016-01-05 15:56:50.442988910 -0500
@@ -604,6 +604,8 @@
         # 2>/dev/null for direct invocation, e.g. in the _filedir unit test
         compopt -o filenames 2>/dev/null
         COMPREPLY+=( "${toks[@]}" )
+    else
+        compopt -o bashdefault 2>/dev/null
     fi
 } # _filedir()

Это позволяет вам съесть свой пирог и получить его тоже: вы можете оставить свой «shopt -s progcmp» bash_completion И, если это не найдет совпадения, он вернется к использованию обработки по умолчанию в bash.

2

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

После shopt -u progcomp , я получаю хорошее поведение для расширения списка.

Ваш логин и поведение не входящей в систему оболочки, вероятно, связаны с получением .bash_profile и /etc/profile , или нет. (Или ваша оболочка входа НЕ получает /etc/bash.bashrc или .bashrc , если ваш профиль не содержит их / их.)

update: отследил ошибку в программируемом завершении: включил set -x и посмотрел вывод всех команд, которые были выполнены после нажатия TAB . Нашел, где выражение glob превратилось в список, и обнаружил, что в /usr/share/bash-completion/bash_completion

Проблема была здесь: (ищите xspec, чтобы найти эти строки)

xspec=${1:+"!*.@($1|${1^^})"}
x=$( compgen -f -X "$xspec" -- "$quoted" ) &&

"$quoted" отсутствовали кавычки, поэтому он расширялся в функциях оболочки обработки завершения. $quoted используется в двойных кавычках в других местах скрипта, поэтому я вполне уверен, что он должен быть заключен в кавычки, и это был правильный способ исправить это.

сообщается как https://bugs.launchpad.net/ubuntu/+source/bash-completion/+bug/1387057, мы надеемся, что исправимся в апстриме и скоро доберутся до всех дистрибутивов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .