Wodurch wird dieser grüne Hintergrund in der Ausgabe von ls verursacht?

141

screencap der ls-Ausgabe auf einem Linux-Rechner

Es gibt zwei Verzeichnisse, die mit 'ls' angezeigt werden. Normalerweise sind Verzeichnisse überall auf schwarzem Hintergrund blau. Aber der erste ist blau auf grün und nicht lesbar. Warum ist das? Wie macht man es blau auf schwarz oder zumindest etwas hell auf etwas dunkel?

Dies ist unter Ubuntu 12.04 mit bash in Gnome Terminal möglich. In der Konsole ist das Blau etwas dunkler und lesbar, könnte aber viel besser sein.

DarenW
quelle

Antworten:

162

Neben der Färbung von Dateien anhand ihres Typs (türkis für Audiodateien, hellrot für Archive und komprimierte Dateien und lila für Bilder und Videos) werden lsauch Dateien und Verzeichnisse anhand ihrer Attribute gefärbt:

  • Schwarzer Text mit grünem Hintergrund zeigt an, dass ein Verzeichnis von anderen Benutzern als dem Eigentümer und der Gruppe beschreibbar ist und dass das Sticky-Bit gesetzt ist ( o+w, +t).
  • Blauer Text mit grünem Hintergrund zeigt an, dass ein Verzeichnis von anderen abgesehen von dem besitzenden Benutzer beschreibbar ist und die Gruppe, und hat nicht hat die Sticky - Bit gesetzt ( o+w, -t).

Stephano Palazzo bei Ask Ubuntu hat dieses sehr lehrreiche Bild über die verschiedenen Attributfarben gemacht:

Was bedeuten die verschiedenen Farben im Terminal?

Wie Terdon betonte, können die Farbeinstellungen über geändert werden dircolors. Auf eine Liste der verschiedenen Farbeinstellungen kann mit zugegriffen werden dircolors --print-database.

Jede Ausgabezeile hat beispielsweise BLK 40;33;01die Form:

[TARGET] [TEXT_STYLE];[FOREGROUND_COLOR];[BACKGROUND_COLOR]
  • TARGET gibt das Ziel für die Farbregel an

  • TEXT_STYLE gibt den Textstil an:

    • 00 = keine
    • 01 = fett
    • 04 = Unterstrich
    • 05 = blinken
    • 07 = rückwärts,
    • 08 = verborgen
  • FOREGROUND_COLOR gibt die Vordergrundfarbe an:

    • 30 = schwarz
    • 31 = rot
    • 32 = grün
    • 33 = gelb
    • 34 = blau,
    • 35 = Magenta
    • 36 = Cyan
    • 37 = weiß
  • BACKGROUND_COLOR gibt die Hintergrundfarben an:

    • 40 = schwarz
    • 41 = rot
    • 42 = grün
    • 43 = gelb
    • 44 = blau,
    • 45 = Magenta
    • 46 = Cyan
    • 47 = weiß

Felder können von rechts beginnend weggelassen werden, also zum Beispiel .tar 01;31fett und rot.

XTerm und die meisten anderen modernen Terminalemulatoren unterstützen 256 Farben.

Ein XTerm 256-Farben-Vordergrundfarbcode hat die Form:

38;5;[FOREGROUND_COLOR]

Ein XTerm-Hintergrundfarbcode mit 256 Farben hat die Form:

48;5;[BACKGROUND_COLOR]

wobei beides FOREGROUND_COLORund BACKGROUND_COLOReine Zahl im Bereich von 0-255 ist. Eine vollständige Liste der Farbcodes für die 16- und 256-Farben-Modi finden Sie im folgenden Screenshot:

16 und 256 Farbmodus-Farbcodes

Thomas Nyman
quelle
5
BACKGROUND_COLOR-Codes stimmen nicht mit FOREGROUND_COLOR überein. Hintergrundcodes sind 40-47
Ryan V. Bissell
38;5;Startet einen xterm 256-Farben- Vordergrundfarbcode. 48;5;Startet einen xterm 256-Farben-Hintergrundfarbcode. Cyan in meiner Dircolors-Ausgabe ist 38;5;51 nicht, 36 obwohl das Ergebnis das gleiche ist.
Stevesliva
1
@stevesliva: Danke für deinen Kommentar. Ich habe die Antwort bearbeitet, um die Hintergrundfarbcodes korrekt anzugeben und die 256-Farben-Vordergrund- und Hintergrundfarbcodes zu beschreiben.
Thomas Nyman
55

Die Farben von lskönnen die Berechtigungen darstellen. Bei einigen Systemen werden standardmäßig Verzeichnisse angezeigt, in denen jeder über Schreibberechtigungen mit grünem Hintergrund verfügt:

Bildbeschreibung hier eingeben

Sie können die Farben ändern, indem Sie Ihre $LS_COLORSVariable mit dircolors(von man ls) bearbeiten :

   Using color to distinguish file types is disabled both by  default  and
   with  --color=never.  With --color=auto, ls emits color codes only when
   standard output is connected to a terminal.  The LS_COLORS  environment
   variable can change the settings.  Use the dircolors command to set it.

Die Syntax ist hier zwar etwas ärgerlich, aber Sie können diese Farbe ändern, indem Sie eine Datei mit den gewünschten Farben erstellen und speichern als ~/.dircolors:

dircolors -p > ~/.dircolors

Dieser Befehl druckt die Standardeinstellungen in ~/.dircolors. Sie müssen diese Datei dann bearbeiten und diese Zeile ändern:

OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky

Zum Beispiel , um es schwarzer Text auf einem roten Hintergrund (siehe hier für eine Liste von Farbcodes):

OTHER_WRITABLE 30;41 # dir that is other-writable (o+w) and not sticky

Sie müssen nicht alle Standardeinstellungen haben. Sie können auch einfach eine Datei mit einer einzelnen Zeile erstellen und nur die Datei neu definieren, die Sie ändern möchten. Wie auch immer, sobald Sie die Datei erstellt haben, laden Sie sie mit:

eval "$(dircolors ~/.dircolors)";

Und hier ist es in Aktion:

Bildbeschreibung hier eingeben

Damit dies automatisch geschieht, fügen Sie den evalobigen Befehl zu Ihrer ~/.bashrcDatei hinzu.

terdon
quelle
8
Die Standardfarben scheinen oft darauf hinzudeuten, dass der ursprüngliche Autor uns und unsere Augen hasst ...
kurtm 10.10.13
1
Vielen Dank. Warum schreibst du manchmal ~ / .dirname und manchmal ~ / dircolors und manchmal ~ / .dircolors? sollen sie gleich sein
Tim
Vielen Dank. Warum eval "$(dircolors ~/dircolors)";statt direkter wie dircolors ~/dircolors?
Tim
@Tim Da dircolors nur die Einstellungen druckt, müssen Sie sie auswerten, damit sie gelesen werden können.
Terdon
damit sie von wem gelesen werden?
Tim
11

Obwohl alle technischen Antworten stimmen, würde ich es als eine informelle Warnung betrachten, dass Sie die Rechte für das großzügige Kopieren von Criss + Cross ein wenig verteilt haben ?)

Wie mache ich es blau auf schwarz, ...?

Ein guter „Entgrüner“, um wieder die Rechte zu erlangen, die Sie höchstwahrscheinlich haben möchten, ist diese Aussage:

chmod -R a-x,o-w,+X thatGreenFolderWithSubfolders/

Am besten verstehen, was es tut, wenn Sie den Zweck von Großbuchstaben + X „special execute“ verstehen, dh siehe Wikipedia

Es ist nur dann wirklich nützlich, wenn es mit '+' und normalerweise in Kombination mit der Option -R verwendet wird, um Gruppen- oder anderen Zugriff auf einen großen Verzeichnisbaum zu gewähren, ohne die Ausführungsberechtigung für normale Dateien (z. B. Textdateien) festzulegen, was normalerweise der Fall wäre Du hast gerade "chmod -R a + rx ...

Frank Nocke
quelle
8

Ich hatte die gleiche Frage, Terdons Antwort ist nett, aber ich denke, es gibt eine Verwechslung zwischen Dirname und Dircolors?

Trotzdem konnte ich nach einigen weiteren Recherchen die Farben ändern, sodass ich meine Lösung hier teile. Es kann eines Tages für jemanden nützlich sein!

Also, 3 einfache Schritte:

Kopieren Sie zunächst, wie Terdon sagte, die Standardfarben in eine Datei

dircolors -p > ~/.dircolors

Ändern Sie dann diese Datei. Sie können einige Werte für Farben in finden, aber ich habe hier mehr gefunden :)

Fügen Sie Ihrer ~/.bashrcDatei abschließend die folgende Zeile hinzu, damit die Farben beim Öffnen eines Terminals automatisch geladen werden:

eval 'dircolors ~/.dircolors' > /dev/null

Voilà :)

KevinG
quelle
1
denn ~/.zshrcich musste mitgehen if [[ -f ~/.dircolors ]] ; then eval $(dircolors -b ~/.dircolors) elif [[ -f /etc/DIR_COLORS ]] ; then eval $(dircolors -b /etc/DIR_COLORS) fi. Entschuldigung, Zeilenumbrüche sind schrecklich
Eric D. Johnson
2

Um das Problem schnell zu beheben, (machen Sie andere beschreibbare Dateien auf nobg gelb):

LS_COLORS+=':ow=01;33'

Ersetzen Sie 33durch 34Blau auf Nobg. Noch einfacher, um es nofg auf nobg zu machen:

LS_COLORS+=:ow=

Um Ihre Änderung dauerhaft zu machen, hängen Sie sie an Ihr .profile an:

echo "export LS_COLORS+=':ow=01;33'" >> ~/.profile

So zeigen Sie die nicht erweiterungsbezogenen Regeln von LS_COLORS an:

echo "$LS_COLORS" | sed 's/:/\n/g' | grep -v '\*.'

sedSetzt jede Regel in eine Zeile und grepentfernt die Regeln, die mit "" beginnen*.'.


lsVerwenden Sie, um die Farben Ihres Terminals zu erkunden

C="$LS_COLORS"
function sc () {
    echo "$LS_COLORS" | sed 's/:/\n/g' | grep -v '\*.'
}
function t () {
    ls /mnt # Or the path to your example directory.
}

Dann

LS_COLORS="$C:ow=38;5;250;48;5;025";t

Wie in einer anderen Antwort (der von Thomas Nyman) angegeben, 38;5;ist das Präfix für den Vordergrund x-term 256-Farben und 48;5;für den Hintergrund x-term 256-Farben. 256-Farben werden jedoch nicht von allen Terminals unterstützt.

Siehe auch - Was bedeuten die verschiedenen Farben in ls? - auf AskUbuntu.

loxaxs
quelle
1

Nun, das bedeutet, dass dieser Ordner Berechtigungen hat, wenn Sie dies ausführen:

сhmod og-w AU_LI

es wird bgcolor entfernen :)

Gorodeckij Dimitrij
quelle
0

Um dies zu beheben, versuchen Sie es mit dem Parameter ow über LS_COLORS

Zum Beispiel:

~LS_COLORS='fi=0:ln=5:pi=0:so=7:bd=5:cd=5:or=31:mi=0:ex=93:*.py=36:di=40:*.zip=33:*.tgz=33'
~ls -l

Bildbeschreibung hier eingeben

Jetzt fügen Sie die Option ow hinzu

~export LS_COLORS='fi=0:ln=5:pi=0:so=7:bd=5:cd=5:or=31:mi=0:ex=93:*.py=36:di=40:*.zip=33:*.tgz=33:ow=0'
~ls -l

Bildbeschreibung hier eingeben

PYK
quelle
0

Sie können den Grünton in Putty ändern, um den Text lesbar zu machen.

Öffne Putty und gehe zu Window \ Colors, wähle "ANSI Green" und setze es auf ein dunkleres Grün (R: 0 G: 70 B: 0).

Erhan Alankus
quelle