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

25

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

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

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

cd \$SCRIPT/

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

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

$SCRIPT/<tab>

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

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

nilchat
источник
Я думаю, что это не имеет отношения к версии 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, пока не знает, как его исправить.

geirha
источник
Есть ли способ вернуться к 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
user164395
источник
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), потому что расширение командной строки недоступно.

kynan
источник
2

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

cd $SCRIPT/

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

cd /home/user/script/

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

Скотт К Уилсон
источник