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.

nunos
fonte
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
Gilles 'SO- parar de ser mau'
fonte
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'
jimmij
fonte
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'
titus.andronicus
fonte
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