Como criar menus para nomes e valores de variáveis de ambiente começando com $ zv?

1

Uau! Eu tenho visto perguntas semelhantes por 2h + aqui! Tenho certeza que só quero uma coisa bem simples.

Em uma sessão bash com muitas funções, temos dezenas de diretórios para visitar. Seus nomes são mantidos em variáveis começando com $zv . Usamos variáveis porque os nomes reais são muito longos.

Alguns são simples e memoráveis, como $zvv . Mas também há coisas como $zvdirection que podem aparecer. E o mais importante é que a lista de variáveis disponíveis muda. O usuário nunca tem certeza de qual $zv... vars estará disponível. Alguns serão totalmente novos, gerados automaticamente.

Então, ela geralmente faz isso:

cd $zv <tab> <tab>

Não há trabalho duro lá. Ela obtém uma lista e conclui manualmente sua linha cd $zv . Mas esses usuários precisam usar esses diretórios rapidamente, o tempo todo, geralmente com novas variáveis $zv... sendo geradas por scripts ocultos.

O que eu tenho tentado por mais de 2 horas é uma função, digamos zv , que mostrará todos os $zv... autocompletes disponíveis no momento, e esperamos que eles também estejam em cd $zv prompt, onde bash está esperando para eles adicionarem os caracteres restantes.

Tenho tanta certeza de que esta função deve ser um forro, mas estou presa!

    
por user251764 05.01.2016 / 08:43

1 resposta

1

Use isto:

arr=()
while read v; do arr+=( "$(printf "%s=%s" "$v" "${!v}")" ); done < <(compgen -v zv)
select i in "${arr[@]}"; do cd "${i#*=}"; break; done

Isso usa o bashs select builtin para fornecer diálogos simples baseados em menu.

  • arr=() inicializa a matriz
  • while ... lê a entrada e preenche a matriz.
    • arr+=( "..." ) adiciona novas entradas ao array.
    • printf "%s=%s" "$v" "${!v}" ... imprime o nome da variável e seu conteúdo.
  • compgen -v zv gera a lista de todas as variáveis que seriam preenchidas ao digitar $zv<tab><tab> .
  • Esta lista é dada para select para gerar o menu.
    • cd "${i#*=}" this cd s no diretório fornecido na variável após o primeiro = .
por 05.01.2016 / 09:52