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

Как заставить 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

решение1

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

решение2

shopt -u progcomp

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

решение3

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

compopt -o filenames 2>/dev/null

к

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

решение4

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

например :

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

Связанный контент