Автоматичне завершення 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 і пізніше
Warren Hill

1
@WarrenHill Це може бути поза темою, оскільки мова йде про помилку (і я проголосував за її закриття). Те, що помилка знаходиться у непідтримуваному випуску, не має жодного значення - ми не закриваємо старі питання, на які є відповіді поза темою, коли настає дата EoL зачепленого випуску. Лише нові запитання EoL без відповіді не відповідають темі.
Елія Каган

Відповіді:


13

Ця помилка була введена в bash 4.2. Тут є довга нитка:

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

Коротше кажучи, Чет Рамі, розробник bash, ще не знає, як іще вирішувати це.


Чи є спосіб повернутися до bash 4.1?
nilchat

1
Виправлена ​​ситуація: Chet додав знімок "direxpand" для відновлення старої поведінки. Це ще не в Онеріку.
Нельсон

8
Мені дивно, що так мало людей скаржилися на це. Це велика зміна в тому, як Баш працював протягом багатьох років.
Скотт C Вілсон

11

Щоб повернути стару поведінку, скористайтеся командою

shopt -s direxpand

або включити його до свого .bashrc

Якщо ви використовуєте один і той же .bashrc з різними версіями bash, використовуйте

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

1
Цей тест буде невдалим для баш 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 ( 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.