1

Вот Это Да! Я просматривал похожие вопросы в течение 2 часов + здесь! Я уверен, что просто хочу довольно простую вещь.

В bash-сессии со многими функциями у нас есть десятки каталогов для посещения. Их имена хранятся в переменных, начинающихся с $zv . Мы используем переменные, потому что настоящие имена очень длинные.

Некоторые из них просты и запоминаемы, например, $zvv . Но есть и такие вещи, как $zvdirection которые могут появиться. И главное, что список доступных переменных меняется. Пользователь никогда не уверен, какие $zv... vars будут доступны. Некоторые будут совершенно новыми, автоматически сгенерированными.

Поэтому она обычно делает это:

cd $zv <tab> <tab>

Там нет тяжелой работы. Она получает список и вручную завершает свою строчку cd $zv . Но эти пользователи должны использовать эти каталоги быстро, постоянно, часто с новыми переменными $zv... , генерируемыми скрытыми скриптами.

Так. То, что я пытался в течение 2+ часов, это функция, скажем, zv , которая покажет им все доступные в настоящий момент автозаполнения $zv... , а затем, надеюсь, также выдаст их в приглашении cd $zv , где bash ожидает для них, чтобы добавить оставшиеся символы.

Я так уверен, что эта функция должна быть одной строкой, но я застрял!

1 ответ1

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

При этом используются встроенные команды bashs select для предоставления простых диалогов на основе меню.


  • arr=() инициализирует массив
  • while ... читает входные данные и заполняет массив.
    • arr+=( "..." ) добавляет новые записи в массив.
    • printf "%s=%s" "$v" "${!v}" ... печатает имя переменной и ее содержимое.
  • compgen -v zv генерирует список всех переменных, которые будут заполнены при вводе $zv<tab><tab> .
  • Этот список предназначен для select для создания меню.
    • cd "${i#*=}" это cd s в каталог, указанный в переменной после первого появления = .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .