bash compgen result contém códigos de cores do terminal

1

Estou usando alias ls='ls --color' e obtendo resultados estranhos com o compgen, onde é autocompleto com o código de cores do terminal

colocar compgen -W "$(ls /someDir/)" no terminal parece bem com ls cor aplicada corretamente

mas com

COMPREPLY=( $(compgen -W "$(ls /someDir/)" -- ${cur}))

saídas

^[[34;40mfilename^[[0m com branco padrão

Existe uma maneira de preservar o resultado colorido em vez de obtê-lo como texto?

    
por qwertyz 28.08.2017 / 22:14

3 respostas

0

O resultado do compgen contém códigos de cores do terminal porque você os coloca lá. Você deve usar alias ls='ls --color=auto' para que só obtenha cores quando ls for impresso em um terminal, não quando a saída for usada por outro comando.

Mas mesmo sem o alias, compgen -W "$(ls /someDir/)" não funciona. Ele chama ls para gerar uma lista de nomes de arquivos, mas a saída de um comando é uma string, não uma lista. compgen divide a saída de ls no espaço em branco, que falhará se algum dos nomes de arquivo contiver um caractere de espaço em branco. Em vez disso, você precisa gerar a lista de nomes de arquivos e remover o prefixo do diretório. Não testado:

files=(/someDir/*)
if [[ -e ${files[0]} -o -L ${files[0]} ]]; then
  for f in "${files[@]}"; do
    compgen -- "${f#/someDir/}"
  done
fi

Você não terá cores. Eu não acho que o bash é capaz de colorir as conclusões. O sistema de conclusão precisa controlar sua exibição no terminal, você não pode inserir caracteres de controle no que é exibido e esperar não confundir o sistema de conclusão. Se você quiser um shell com ótimos recursos como preenchimentos coloridos , use zsh (ou peixe se você não gosta de configurabilidade).

    
por 29.08.2017 / 01:21
1

Não use ls aqui; as cores não devem fazer parte da saída, pois você não as quer como parte da conclusão. -W não é uma boa escolha para nomes de arquivos, já que qualquer nome de arquivo correspondente pode conter um caractere usado para separar as palavras no argumento para -W .

Você deve usar apenas um glob para definir COMPREPLY diretamente:

COMPREPLY=( "$cur"* )
    
por 28.08.2017 / 23:46
0

Você deve usar:

COMPREPLY=( $(compgen -W "$(ls /someDir/ --color=never)" -- ${cur}))

Com - color = never funciona como esperado.

    
por 28.12.2017 / 13:54