предотвращение завершения bash от изменения переменной подчеркивания $ _

При использовании завершения вкладки в bash переменная $_ изменяется:

 $ mkdir test $ cd <TAB><TAB> $_ bash: cd: -d: invalid option cd: usage: cd [-L|[-P [-e]]] [dir] 

<TAB><TAB> будут перечислены все файлы в текущем каталоге, но я не буду использовать вывод и вместо $_ вместо. Команда, выполненная в этой строке, будет просто cd $_ .)

Ожидаемое поведение было бы изменить на ./test .

Как я могу предотвратить завершение bash из-за изменения $_ ?

  • Хранить вывод netcat в переменную
  • Почему значение переменной не изменяется внутри backticks?
  • Наследование переменных среды в systemd Контейнер докеров
  • Имя переменной из вывода команды
  • Использование столбца nos в качестве значения переменной
  • новые строки и переменная bash
  • Получить номер предыдущей недели в bash
  • Инициализация переменной с помощью эха
  • One Solution collect form web for “предотвращение завершения bash от изменения переменной подчеркивания $ _”

    Вы используете пакет bash-completion (или производный). Для каждого завершения аргумента команды cd (как показано complete -p выходом complete -p ):

     complete -o nospace -F _cd cd 

    функция _cd вызывается для определения завершений (слегка отредактированная для краткости):

     _cd() { local cur prev words cword _init_completion || return local IFS=$'\n' ijk compopt -o filenames if [[ -z "${CDPATH:-}" || "$cur" == ?(.)?(.)/* ]]; then _filedir -d return 0 fi .... 

    Так, например, когда вы заканчиваете каталоги без набора CDPATH , последний увиденный аргумент для команды -d , и это автоматически помещается в _ . В этой функции есть несколько других путей кода с похожими побочными эффектами.

    Поскольку _ является внутренним bash, обычное сохранение / восстановление (как для IFS ) не будет работать так, как надеется. Вы можете сделать это с небольшим обманом:

     _cd() { local save_="$_" ... : $save_ return 0 

    Вы должны сохранить _ немедленно при входе в функцию : – это нулевая команда, которая ничего не делает, но имеет обычные побочные эффекты команды, такие как установка _ . Эта операция восстановления потребуется для каждой точки возврата каждой потенциально разрушительной функции. Здесь тоже тонкость: обычно _ устанавливается сразу после возврата из функции (до последнего аргумента вызова функции, как и ожидалось), что сделало бы этот метод неэффективным. Но этого не происходит, когда вызывается функция завершения, поскольку она не вызвана явным образом. Я не считаю это очень надежным …

    (Я предпочитаю расширение истории и придерживаюсь !$ Который не страдает этой проблемой.)

    Linux и Unix - лучшая ОС в мире.