Nenhuma saída colorida em menos para o comando ls


21

Se eu executar ls, recebo uma saída colorida, que acho bastante útil para obter rapidamente uma olhada no tipo de arquivo. Quando tento canalizá-lo até lessmesmo com as bandeiras -re -R, a coloração sempre se perde. Estou usando a zshversão 5.0.7. Alguma ideia? Obrigado.

edit: Estou no OS X.


Você pode confirmar que lsestá sendo chamado --color? Tente suspender a tubulação ( ^Z) ou usar a pspartir de outro terminal. Que saída which lsproduz?
zackse

Limpei isso da fila de espera, uma vez que o OP declarou claramente que eles estão usando, less -rpor isso não é um problema, lessmas comls
terdon

Estou surpreso que isso ainda não esteja duplicado, mas o mais próximo que pude encontrar foi a saída do comando Store na variável , e isso está no Superusuário.
1818 Scott Scott

@ Scott Não tenho certeza se existe duplicata exata, mas existem algumas perguntas para as quais a resposta é muito semelhante (o lsresultado depende do stdout). O que eu lembro é unix.stackexchange.com/questions/157285/…, que é marcado como duplicado de unix.stackexchange.com/questions/10421/…
jimmij

@jimmij Mas essas perguntas não mencionam que ls --color=autosignifica usar cores somente ao escrever em um terminal (ou seja, quando a saída padrão é um terminal), e não quando é um arquivo ou um pipe.
1876 ​​Scott Scott

Respostas:


21

Isso ocorre por design: os programas que produzem saída colorida geralmente o fazem apenas quando a saída é direcionada para um terminal, não quando é enviada para um pipe ou para um arquivo comum. O motivo é que os dados enviados em um terminal são presumivelmente lidos por um ser humano, enquanto os dados canalizados para um programa ou gravados em um arquivo provavelmente serão analisados ​​por algum programa, portanto, não devem conter conteúdo estranho, como sequências de escape que mudam de cor .

O GNU lsexibe uma saída colorida em um terminal quando você passa na opção --color(ou --color=auto). Para forçar a saída colorida, independentemente do tipo de arquivo da saída padrão, passe --color=alwaysou --color=yes(são sinônimos). Esta convenção foi seguida por outros comandos, como GNU grep, FreeBSD grep git diff, etc.

ls --colors=yes -l | less

Com a versão do FreeBSD ls(também encontrada no OSX e disponível como colorlsporta no OpenBSD e NetBSD), passe a opção -Gde exibir cores quando a saída for um terminal. Defina o ambiente CLICOLOR_FORCEpara exibir cores, independentemente do tipo de arquivo de saída.

CLICOLOR_FORCE=1 ls -l | less

20

O problema provavelmente é que seu lsprograma configurou a opção, o --color=autoque basicamente significa que a saída deve ser colorida somente se estiver conectada ao terminal; caso contrário (saída conectada a um tubo ou arquivo), nenhuma cor será emitida.

Se você deseja ter cores nesses casos, defina a --coloropção como always, então tente

ls --color=always | less -R

Se esse comportamento é o que você espera o tempo todo, basta criar um alias:

alias ls='ls --color=always'

Na minha configuração, o bash versão 4.3, --color é uma opção ilegal. Grepping para "color" me fala da opção "-G", mas não diz nada sobre a opção auto ou always. Alguma ideia?
Nunos

5
O @nunos lsnão vem bash, é um programa independente. Execute ls --versionpara verificar sua versão. O meu é o seu núcleo GNU) 8.21 .
jimmij

@jimiij minha lsversão não tem a --versionbandeira. Estou usando o padrão do OS X, não tenho certeza se isso ajuda.
Nunos

@unos, sempre mencione seu sistema operacional. Existem enormes diferenças entre os nixes Linux e não GNU, como o OSX.
terdon

0

Não posso comentar a resposta de @jimmij, porque tenho menos de 50 representantes, mas gostaria de explicar o que funcionou para mim no Bash.

Se você correr

$ man ls | grep color

você verá todas as entradas da página manpara o seu ambiente shell específico (no nosso caso bash).

Para mim, o seguinte ajuste fez o truque:

$ alias ls='ls -G'

3
Isso funcionou para quê? A -Gbandeira não tem nada a ver com o modo como lsgerencia sua saída colorida. Isso apenas remove os grupos da saída de ls -l. Isso afeta a saída de cores no BSD ls (também usado no OSX), é isso que você quer dizer? De qualquer forma, não acho que isso mostrará cores quando redirecionado para um arquivo, apenas mostrará cores na linha de comando.
terdon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.