Как создать меню для имен и значений переменных среды, начинающихся с $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 в каталог, указанный в переменной после первого появления =,
Другие вопросы по тегам