bash coluna comando confuso por escapa de cor ANSI

7

Eu tenho um script bash que eu tenho dos dotfiles de Gary Bernhardt que imprime uma boa listagem colorida dos commits recentes do git. Ele usa o comando column para alinhar a saída em colunas. No meu mac, funciona maravilhosamente.

Estranhamente, no entanto, quando eu corro no Cygwin ou no CentOS 6, o bit da coluna não funciona. Todos os campos têm três espaços entre eles, independentemente de seu comprimento, produzindo calhas irregulares entre "colunas". Eu reduzi para os códigos de escape de cor ANSI. Se eu removê-los, as colunas sairão alinhadas.

A versão zsh é a mesma em todos os três (e o problema aparece exatamente da mesma maneira no bash). Não sei dizer qual é a versão de column , mas elas são exatamente iguais e as páginas de manual são as mesmas para qualquer coisa que valha a pena.

Por que isso funcionaria no meu Mac, mas não nos outros sistemas operacionais?

    
por scanny 22.09.2013 / 08:42

2 respostas

1

column funciona por caractere. Ele conta os caracteres imprimíveis de cada célula e depois os blocos para alinhá-los (veja origens de código para v2.29).

O problema que você está enfrentando é que seu fluxo contém sequência de escape ANSI não imprimível que incorpora caracteres imprimíveis. column , em seguida, falha ao calcular a largura mínima da célula real dessas células e desalinha as próximas células da mesma linha.

Aqui está um exemplo com o código de cor azul <esc>[34m para a célula A , usando a coluna v2.29:

$ echo '3[34mA3[0m B\nC D'|column -t
A  B
C         D

A cell é visto como um caractere imprimível de altura, pois somente os caracteres de escape são detectados como não imprimíveis. Por isso, a coluna C recebe sete espaços de preenchimento indesejados.

Observe que esse comportamento não é consistente nos lançamentos da coluna. A versão 2.26 usa wcswidth para calcular a largura visível das células e leva a um erro diferente alinhamento.

    
por 25.11.2016 / 23:48
0

Possivelmente, o comando column analisa $TERM e / ou $LANG para ver o que (se houver) constitui um código de cor.

Naturalmente, você poderia usar apenas git log --pretty=format:... para gerar um log codificado por cores alinhado por coluna para começar. Por exemplo, eu uso git hist e tenho isso no meu ~/.git/config :

[alias]
   hist = log --pretty=format:\"           \t%C(yellow)%h %C(red)%ad %C(cyan)%aN%C(reset)   \t| %s%C(blue)%d%C(reset)\" --graph --date=short
    
por 13.01.2016 / 03:34