Как создать меню для имен и значений переменных среды, начинающихся с $zv?
Вот Это Да! Я просматривал похожие вопросы в течение 2 часов + здесь! Я уверен, что просто хочу довольно простую вещь.
В bash-сессии со многими функциями у нас есть десятки каталогов для посещения. Их имена хранятся в переменных, начиная с $zv, Мы используем переменные, потому что настоящие имена очень длинные.
Некоторые из них простые и запоминающиеся, как $zvv, Но есть и такие вещи, как $zvdirection это может появиться. И главное, что список доступных переменных меняется. Пользователь никогда не уверен, что $zv... Вары будут доступны. Некоторые будут совершенно новыми, автоматически сгенерированными.
Поэтому она обычно делает это:
cd $zv <tab> <tab>
Там нет тяжелой работы. Она получает список и вручную завершает ее cd $zv линия. Но эти пользователи должны использовать эти каталоги быстро, все время, часто с новым $zv... переменные генерируются скрытыми скриптами.
Так. То, что я пытался в течение 2+ часов для функции, скажем, zv, который покажет им все доступные на данный момент $zv... автозаполнения, а затем, надеюсь, также дать им на cd $zv подскажите, где bash ждет их добавления оставшихся символов.
Я так уверен, что эта функция должна быть одной строкой, но я застрял!
1 ответ
Использовать этот:
arr=()
while read v; do arr+=( "$(printf "%s=%s" "$v" "${!v}")" ); done < <(compgen -v zv)
select i in "${arr[@]}"; do cd "${i#*=}"; break; done
Это использует Баш select встроенный, чтобы обеспечить простые диалоги на основе меню.
arr=()инициализирует массивwhile ...читает входные данные и заполняет массив.arr+=( "..." )добавляет новые записи в массив.printf "%s=%s" "$v" "${!v}"... печатает имя переменной и ее содержимое.
compgen -v zvгенерирует список всех переменных, которые будут заполнены при наборе$zv<tab><tab>,- Этот список дан
selectсоздать меню.cd "${i#*=}"этотcds в каталог, указанный в переменной после первого появления=,