Saída de cores inconsistente do comando `ls`

28

Ensino um curso de Introdução ao UNIX / Linux em uma faculdade local e um dos meus alunos fez a seguinte pergunta:

Por que alguns dos arquivos do meu diretório são brancos e outros são cinza? Os brancos são os que eu criei hoje e o cinza são arquivos existentes?

Ao analisar isso, pensei primeiro que a resposta estaria na LS_COLORSvariável, mas uma investigação mais aprofundada revelou que as listas de cores eram diferentes ao usar o -lswitch versus o -alswitch com o lscomando. Veja as seguintes capturas de tela:

usando ls -l o arquivo chamado '3' é exibido em branco

usando a opção -al, o mesmo arquivo mostra um cinza

O uso ls -ldo arquivo chamado '3' é exibido em branco, mas, com a -alopção, o mesmo arquivo mostra um cinza.

Isso é um bug no sl ou alguém sabe por que isso está acontecendo?

Bill R
fonte
Escreva o título da sua pergunta: essa coloração não tem nada a ver com o lspróprio comando.
Drew
FWIW, o mais próximo que você pode chegar disso mexendo com LS_COLORS é LS_COLORS='rs=0;1' ls -l, mas parece muito diferente.
wjandrea
4
@ Drew Você só sabe disso depois de investigar o problema. Obviamente, lspode mudar a cor de sua saída.
pipe
@pipe: Não, eu sei disso desde muito antes de haver cores. Ele não precisa fornecer cores, mesmo que versões recentes ls possam fornecer cores. ;-)
Drew

Respostas:

68

Parece que sua string de prompt ( $PS1) está definindo o atributo negrito nos caracteres para tornar as cores mais agradáveis ​​e não desmarcando -as. A saída lsnão sabe sobre isso, e faz unset negrito. Então, após a primeira saída de cores ls, tudo parece mais escuro.

Thomas Dickey
fonte
1
Sim, era isso. Última alteração de cor no conjunto $ PS1 em negrito + branco (1; 37) - Obrigado!
Bill R
3
Você pode marcar como aceito, então.
Thomas Dickey
0

Toda a saída de ls será impressa na última cor ativa . Se lsfor chamado sem cor:

$ printf '\e[0;31m color test\n'; /bin/ls
 color test
filea  fileb  filec  filed  filee  filef  fileg  fileh

imprimirá a lista de arquivos em vermelho .

Ou, se não houver alteração de cor necessária para ls, a última cor permanecerá:

$ mkdir t1; cd t1; touch file{a..h}
$ printf '\e[0;31m color test\n'; /bin/ls --color -l
 color test
total 0
-rw-r--r-- 1 user user 0 Feb 23 01:16 filea
-rw-r--r-- 1 user user 0 Feb 23 01:16 fileb
-rw-r--r-- 1 user user 0 Feb 23 01:16 filec
-rw-r--r-- 1 user user 0 Feb 23 01:16 filed
-rw-r--r-- 1 user user 0 Feb 23 01:16 filee
-rw-r--r-- 1 user user 0 Feb 23 01:16 filef
-rw-r--r-- 1 user user 0 Feb 23 01:16 fileg
-rw-r--r-- 1 user user 0 Feb 23 01:16 fileh

Ainda assim, tudo em vermelho.

Porém, assim que lsprecisar definir uma cor (e redefinir as cores para o padrão usado pelo console), a cor usada a partir de então será o padrão do console.

$ printf '\e[0;31m color test\n'; /bin/ls --color -la
 color test
total 8
drwxr-xr-x 2 user user 4096 Feb 23 01:16 .
drwxr-x--- 7 user user 4096 Feb 23 01:15 ..
-rw-r--r-- 1 user user    0 Feb 23 01:16 filea
-rw-r--r-- 1 user user    0 Feb 23 01:16 fileb
-rw-r--r-- 1 user user    0 Feb 23 01:16 filec
-rw-r--r-- 1 user user    0 Feb 23 01:16 filed
-rw-r--r-- 1 user user    0 Feb 23 01:16 filee
-rw-r--r-- 1 user user    0 Feb 23 01:16 filef
-rw-r--r-- 1 user user    0 Feb 23 01:16 fileg
-rw-r--r-- 1 user user    0 Feb 23 01:16 fileh

Com as três primeiras linhas (até o ponto azul) impressas em vermelho.

Isaac
fonte