Inkonsistente Farbausgabe vom Befehl 'ls'

28

Ich unterrichte einen UNIX / Linux-Einführungskurs an einem örtlichen College und einer meiner Schüler stellte die folgende Frage:

Warum sind einige Dateien in meinem Verzeichnis weiß und andere grau? Sind die weißen Dateien, die ich heute erstellt habe, und die grauen Dateien bereits vorhanden?

Als ich dies untersuchte, dachte ich zuerst, dass die Antwort in der LS_COLORSVariablen liegen würde, aber weitere Untersuchungen ergaben, dass die Farblisten bei Verwendung des -lSchalters anders waren als bei Verwendung des -alSchalters mit dem lsBefehl. Siehe die folgenden Screenshots:

Mit ls -l wird die Datei mit dem Namen '3' weiß angezeigt

Mit der Option -al wird dieselbe Datei grau angezeigt

Wenn Sie ls -ldie Datei mit dem Namen '3' verwenden, wird diese als weiß -alangezeigt. Wenn Sie jedoch den Schalter verwenden, wird dieselbe Datei grau angezeigt.

Ist dies ein Fehler in ls oder weiß jemand, warum dies geschieht?

Bill R
quelle
In deinem Fragentitel: Eine solche Färbung hat nichts mit dem lsBefehl selbst zu tun .
Drew
FWIW, das LS_COLORS='rs=0;1' ls -l, was Sie am ehesten erreichen , wenn Sie mit LS_COLORS herumspielen, ist , aber es sieht ganz anders aus.
wjandrea
4
@Drew Das weißt du erst, nachdem du das Problem untersucht hast. Offensichtlich lskann sich die Farbe seiner Ausgabe ändern.
Pipe
@pipe: Nee, das weiß ich schon lange bevor es Farbe gab. Es muss keine Farbe bereitstellen, auch wenn neuere Versionen von Farbe bereitstellen ls können . ;-)
Drew

Antworten:

68

Es sieht so aus, als ob Ihre Eingabeaufforderung ( $PS1) das Fett-Attribut für Zeichen setzt, um die Farben schöner zu machen und nicht zu deaktivieren . Die Ausgabe von lsweiß nichts davon und ist nicht fett gesetzt. Also nach der ersten Farbausgabe von lssieht alles dunkler aus.

Thomas Dickey
quelle
1
Ja, das war es. Letzte Farbänderung in $ PS1 fett + weiß (1; 37) - Danke!
Bill R
3
Sie können es dann als akzeptiert markieren.
Thomas Dickey
0

Die gesamte Ausgabe von ls wird in der zuletzt aktiven Farbe gedruckt . Wenn lsohne Farbe aufgerufen wird:

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

druckt die Liste der Dateien in rot .

Wenn für ls keine Farbänderung erforderlich ist, bleibt die letzte Farbe erhalten:

$ 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

Trotzdem alles in Rot.

Sobald jedoch lseine Farbe festgelegt werden muss (und die Farben dann auf die von der Konsole verwendete Standardfarbe zurückgesetzt werden müssen), ist die von da an verwendete Farbe die Standardfarbe der Konsole.

$ 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

Mit den ersten drei Zeilen (bis zum blauen Punkt) in rot gedruckt.

Isaac
quelle