Завершение вкладки оболочки Bash, не расширяйте ~


12

Я часто использую Tabключ, когда использую оболочку (bash).

Но меня раздражает то, что ~всегда расширяется до /home/"user". Я не думаю, что это всегда было так; Есть ли способ остановить это поведение?

Пример:

  1. cj@zap:~$ ls ~/
  2. Нажмите Tab
  3. cj@zap:~$ ls /home/cj/

Я хотел бы продолжать иметь ~/и не в конечном итоге /home/cj/.


2
«Не думаю, что так было всегда». - Программируемое завершение отменяет настройку readline set expand-tilde off(по умолчанию или установлена ​​в ~/.inputrc).
Приостановлено до дальнейшего уведомления.

"bind -v | grep tilde" возвращает "установить расширение-тильду выкл" ... так что я не думаю, что это поможет.
Йохан

Вы могли бы взглянуть на shopt -p direxpand.
gam3

Ответы:


10

Отключение расширения тильды происходит быстро и безболезненно. Откройте ~/.bashrcи вставьте это:

_expand()
{
    return 0;
}

Это переопределит функцию расширения из /etc/bash_completion. Я бы порекомендовал прокомментировать, что он делает над функцией, на случай, если вы захотите расширить его в будущем. Изменения вступят в силу в новом экземпляре.


хотя _expand(){ true; }короче :)
тиг

не так ли _expand(){ false; }? @tig
Джон Т

2
@ Джон: нет, это должно быть правдой. trueвозвращает успешный результат, и успешный результат равен 0, поэтому return 0равен trueв состоянии выхода и return 1равен false. просто попробовать true; echo $?и false; echo $?.
Тиг

@tig слишком много программирования сбило меня с толку ... codepad.org/Frb3RyAN Точно так же вы найдете это в большом количестве кода (см. верхнюю часть): cs.nthu.edu.tw/~tingting/DS_mid_solution.pdf Я бы предположил, что он включен в инструментах GNU для обозначения более реалистичного значения, т. е. «True, программа успешно запущена» или «false - программа работает неправильно».
Джон Т

@Джон: это нормально :), «Даже Джон Т может ошибаться» (не обижайтесь :))
tig

5

С более новым bash_completion кажется, что вам также нужно переопределить __expand_tilde_by_ref:

__expand_tilde_by_ref() {
  return 0
}

1

Еще более компактно:

_expand() { :; }

... as ":" - это встроенная оболочка, эквивалентная "true" :-)


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.