Вопрос или проблема
В предыдущих версиях Ubuntu 18.04 переменные в Bash развертывались при нажатии на клавишу Tab. Но в Ubuntu 20.04 (с использованием bash 5.0.16) переменные не разворачиваются. Вместо этого знак доллара $
перед переменной предшествует обратной косой чертой.
Например, предположим, у меня есть переменная MY_DIRECTORY
:
export MY_DIRECTORY=/path/to/a/folder
Теперь, когда я пишу что-то вроде этого:
ls $MY_DIRECTORY<Tab key>
Я получаю:
ls \$MY_DIRECTORY
Как видите, переменная не разворачивается в желаемый путь. В чем тут дело?
У вас есть две возможности для развертывания переменной в Bash:
-
Используйте сочетание клавиш Ctrl+Alt+E всякий раз, когда хотите развернуть переменную.
Например, если я пишу в своем терминале:
$LANG $BASH
и затем нажимаю сочетание клавиш, то вышеуказанные переменные развернутся следующим образом:
en_US.UTF-8 /usr/bin/bash
Из
man bash
, если вы поищите “M-C-e” (“M” означает “Meta”, что соответствует клавише Alt на большинстве клавиатур, а “C” означает Control):shell-expand-line (M-C-e) Развернуть строку как это делает оболочка. Это выполняет развертывание псевдонимов и истории, а также все расширения слов оболочки. Смотрите раздел ИСТОРИЯ РАЗВЕРТКИ ниже для описания развертывания истории.
-
Включите параметр
shopt
direxpand
, выполнив в своем терминале:shopt -s direxpand
Теперь, если вы наберете:
ls $MY_DIRECTORY/<Tab key>
он будет развернут в:
ls /path/to/a/folder/
Чтобы параметр
direxpand
был включен для всех сеансов терминала, добавьтеshopt -s direxpand
в ваш файл~/.bashrc
вручную или выполнив:echo "shopt -s direxpand" >> ~/.bashrc
Ответ или решение
Почему переменные в Bash не расширяются при нажатии клавиши Tab в Ubuntu 20.04?
В версиях Ubuntu, таких как 18.04, по умолчанию была включена функция расширения переменных при нажатии клавиши Tab в командном интерпретаторе Bash. Однако в Ubuntu 20.04, использующей Bash версии 5.0.16, данное поведение изменилось. Теперь при попытке завершить переменную с помощью клавиши Tab вместо ожидаемого пути отображается экранированное имя переменной, например, \$MY_DIRECTORY
.
Причины изменения поведения
Это изменение связано с обстоятельствами, касающимися настройки командного интерпретатора, а именно, с опцией direxpand
, которая отвечает за расширение переменных во время завершения команд. В случае, если эта опция не активирована, Bash будет просто экранировать символ доллара, предотвращая его интерпретацию как обозначение переменной.
Решения для расширения переменных
Существуют два основных способа решения проблемы нерасширяемости переменных в Bash:
-
Использование сочетания клавиш:
Для временного расширения переменных вы можете воспользоваться сочетанием клавишCtrl + Alt + E
. Для этого введите строку с переменными, например:$LANG $BASH
После нажатия сочетания клавиш результат будет автоматически расширен до текущих значений переменных, таких как
en_US.UTF-8 /usr/bin/bash
.Помните, что эта функция может потребовать предварительного изучения справочного руководства Bash (
man bash
) для лучшего понимания возможностей и конфигураций. -
Включение опции direxpand:
Параметрdirexpand
может быть включен для автоматического расширения версий переменных при помощи команд завершения. Для этого выполните в терминале команду:shopt -s direxpand
Теперь при введении команды с переменной, такой как:
ls $MY_DIRECTORY/<Tab>
вы получите желаемый результат:
ls /path/to/a/folder/
Чтобы сделать это изменение постоянным для всех будущих терминальных сессий, добавьте строку
shopt -s direxpand
в ваш файл конфигурации~/.bashrc
. Это можно сделать и с помощью следующей команды:echo "shopt -s direxpand" >> ~/.bashrc
Заключение
В Ubuntu 20.04 поведение Bash изменилось, и расширение переменных при нажатии клавиши Tab больше не происходит по умолчанию. Однако использование сочетания клавиш или активация опции direxpand
способны вернуть это удобное поведение. Эти настройки помогут улучшить вашу продуктивность в терминале Ubuntu и существенно упростят работу с переменными в Bash.