Автозаполнение Bash для переменных окружения [закрыто]


25

Функция автозаполнения bash не работает с переменными среды в 11.04. Текущее поведение указано ниже

export SCRIPT=/home/user/script
cd $SCRIPT/<tab>

приводит к добавлению обратной косой черты ( \) до $SCRIPTтого, как приглашение станет

cd \$SCRIPT/

То же самое происходит, если cdзаменить lsили любой другой командой

Кроме того, если в пути к $ SCRIPT есть исполняемый файл, и я хочу запустить его

$SCRIPT/<tab>

Bash не показывает параметры внутри папки (независимо от того, есть ли один путь или несколько файлов / каталогов внутри пути, содержащегося в переменных среды).

Другими словами, автозаполнение не работает с переменными среды.



Я думаю, что это не имеет отношения к версии bash (4.1 или 4.2). Я только что установил bash-4.1 из исходных кодов и использовал его вместо 4.2.24 (версия Ubuntu 12.04; установлен из исходных кодов, поэтому мне не нужно «задерживать» пакет при каждом обновлении sys) и поведение точно так же. Очень, очень раздражает ...

4
Этот вопрос кажется не по теме, потому что он касается ошибки в старой неподдерживаемой версии. Ошибка описана здесь и была исправлена ​​в 12.04 и позже
Уоррен Хилл

1
@WarrenHill Это может быть не по теме, потому что речь идет об ошибке (и по этой причине я проголосовал за ее закрытие). То, что ошибка находится в неподдерживаемом выпуске, не имеет значения - мы не закрываем старые вопросы , ответы на которые не по теме, когда наступает дата EoL уязвимого выпуска. Только новые / оставшиеся без ответа вопросы EoL не по теме.
Элия ​​Каган

Ответы:


13

Эта ошибка была введена в Bash 4.2. Здесь есть длинная тема:

http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00274.html

Короче говоря, Chet Ramey, разработчик bash, пока не знает, как его исправить.


Есть ли способ вернуться к bash 4.1?
нильчат

1
На подходе исправление: Чет добавил «директ-панд», чтобы восстановить старое поведение. Это еще не в Oneiric.
Нельсон

8
Меня удивляет, что так мало людей жаловались на это. Это большое изменение по сравнению с тем, как bash работал в течение нескольких лет.
Скотт С. Уилсон,

11

Чтобы вернуть старое поведение, используйте команду

shopt -s direxpand

или включить его в свой .bashrc

Если вы используете один и тот же .bashrc с разными версиями bash, используйте

if ((BASH_VERSINFO[0] >= 4)) && ((BASH_VERSINFO[1] >= 2))
    then shopt -s direxpand
fi

1
Этот тест не пройдёт для bash 5.0 и 5.1.
Кит Томпсон

8

Обходной путь, предложенный в http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00274.html :

  1. использовать <Tab>для автоматического заполнения вашей переменной окруженияcd $MYVAR
  2. нажмите <Esc>+, <Ctrl>-Eчтобы развернуть текущую командную строку, т.е. заменить $MYVARее значением путь
  3. добавьте /и наслаждайтесь <Tab>автозаполнением как обычно

Предполагается, что вы находитесь в режиме emacs ( set -o emacs) и bash_completionнастроены для cd(например, complete -o nospace -F _cd cd).

К сожалению, это не работает в vi mode ( set -o vi), потому что расширение командной строки недоступно.


2

После ввода переменной оболочки

cd $SCRIPT/

введите Cntrl-Alt-E. Это расширяет переменную

cd /home/user/script/

Это работает с EDITOR = vi в Fedora 16.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.