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

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

 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
68
задан 21 March 2019 в 18:03

8 ответов

Я обнаружил, что версии 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?" в gnu.bash.bug . Прочитав их, я нашел здесь информацию.

54
ответ дан 21 March 2019 в 18:03

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

compopt -o filenames 2>/dev/null

на

compopt -o filenames -o noquote 2>/dev/null
4
ответ дан 21 March 2019 в 18:03

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

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

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


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

1
ответ дан 21 March 2019 в 18:03

Я столкнулся с той же проблемой с Bash в Cygwin. Я исправил свою проблему, установив следующий параметр.

shopt -s cdable_vars

http://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

0
ответ дан 21 March 2019 в 18:03

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

например:

cd /bin
echo ~+/ls
/bin/ls
2
ответ дан 21 March 2019 в 18:03

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

shopt -u complete_fullquote
0
ответ дан 23 November 2019 в 00:16
shopt -u progcomp

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

13
ответ дан 23 November 2019 в 00:16

В GNU bash версии 4.2.46 (2) -release параметры complete_fullquote и noquote недоступны. Параметр cdable_vars работает только на cd ; direxpand расширяет переменную.

Что лучше всего сработало для меня:

shopt -u progcomp

Он работал с другими командами, кроме cd , сохраняя переменные вместо их расширения.

1
ответ дан 4 January 2021 в 12:04

Другие вопросы по тегам:

Похожие вопросы: