Как заставить bash перестать экранировать $ во время завершения табуляции?


38

У меня есть это в командной строке:

ln -sf $PWD/wine-

и затем я нажимаю, Tabчтобы завершить имя файла. В более ранних версиях Ubuntu это работало просто отлично, чтобы завершить wine-имя файла (и как побочный эффект $PWDбыл бы расширен в то время). Но теперь это превращается в

ln -sf \$PWD/wine-

это совсем не то, что я имел в виду и ничего не завершает, так как файл буквально не начинается с $.

Как мне вернуться к менее нарушенному поведению?

set говорит мне, что это мои текущие настройки:

BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

2
Если вы столкнулись с этой ошибкой, рассмотрите возможность голосования по следующему адресу (требуется логин): bugs.launchpad.net/ubuntu/+source/bash/+bug/778627/…
cripton

Ответы:


36

Я обнаружил, что версии bash> = 4.2.29 имеют новую direxpandнастройку shopt. (Смотрите, man docs/bash.1если вы посмотрите новый bash, или посмотрите bash.1 из строки 8951 )

Если кто-то использует Quantal Quetzal 12.10 или иным образом получает (или проверяет и создает) новый bash, то:

shopt -s direxpand

Дает мне поведение, которое я хочу, нуждаюсь и люблю.

Решение: В то же время, Ctrl+ Alt+ Eвместо того , Tabделает то , что я хочу тоже. Но это неловко.

Кстати, Есть несколько потоков, которые называются "вопрос расширения переменной bash tab?" в gnu.bash.bug . Прочитав их, я нашел информацию здесь.


2
версия bash с direxpand пробивается в Precise (12.04): см. bugs.launchpad.net/bugs/778627
keturn

8
Было бы еще лучше, если бы у меня не было расширенного огромного пути, и я мог бы продолжить использование неэкранированной переменной с завершением.
jozxyqk

@jozxyqk Вы когда-нибудь находили способ получить эту функцию без расширения пути?
Ungeheuer

@Ungeheuer В настоящее время я использую bash 4.4.19в Ubuntu 18.04, и он просто работает. Не уверен, когда это изменилось.
Jozxyqk

Ответ user3080602 ниже работал для меня - shopt -u progcompрешает проблему, не расширяя переменную до ее значения
Gilthans

2

поиск _filedir()в скрипте bash_completion верхнего уровня и изменение строки

compopt -o filenames 2>/dev/null

в

compopt -o filenames -o noquote 2>/dev/null

В 12.04 GNU bash, версия 4.2.25, это предложение выдает ошибку:compopt: noquote: invalid option name
arielf

1

Для тех (как я) с 12.04 можно использовать ~ + вместо $ PWD ...

например :

cd /bin
echo ~+/ls
/bin/ls

1

Даже с обновленным bash я обнаружил, что $все равно сбежал.

  • Удаление bash-completion (1:2.1-3.fc20)пакета
  • или просто не /etc/bashrcиз источников, ~/.bashrcказалось, это исправить.

Я подозреваю, что теперь мне не хватает некоторых функций, к которым я обычно привык, но еще не заметил.


Альтернатива (по крайней мере для Fedora 26), добавьте export BASH_COMPLETION_VERSINFO=0перед поиском /etc/bashrc. Это заставляет проблемный сценарий думать, что он уже получен.


1
shopt -u progcomp

Это исправило это для меня, оно также удалило много «интеллектуальных» вариантов завершения, которые, как я обнаружил, мешают не завершать файлы, которые, как я знаю, существуют, потому что глупая вещь думает, что я не хочу, чтобы они были аргументами для конкретного команда. ARRRGH


Это сделало это для меня! Он не экранирует переменную и не расширяет ее. Благодарность!
Гилтанс


0

Отключение опции оболочки 'complete_fullquote' делает работу:

shopt -u complete_fullquote

$ shopt -u complete_fullquote -bash: shopt: complete_fullquote: неверное имя опции оболочки
Антон Горев
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.