ls Farben: Warum sind einige meiner Schriftarten in der Ausgabe schwarz und andere grün

10

Ich habe einige Schriftdateien auf AWS (unter Amazon Linux) hochgeladen und sie /usr/share/fontsmit einem cpBefehl in .ebextensions in das Verzeichnis verschoben.

Wenn ich SSH von meinem Mac aus einnehme und benutze ls -a, sehe ich, dass einige Dateien unterschiedlich gefärbt sind - ein Satz von Schriftdateien ist schwarz, während andere grün sind. Ich bin gespannt, warum dies so war und ob es Probleme für meinen Code gibt .

Schriftartenverzeichnis unter Elastic Beanstalk unter AWS Linux

ls -la Screenshot

Aus einer anderen Antwort auf AskUbuntu habe ich diesen Schlüssel zur Interpretation dieser Farben gefunden. Ich kann nicht verstehen, warum eine .ttf-Datei ausführbar ist oder warum eine Gruppe von .ttfs erkannt wird und keine andere.

Blau: Verzeichnis

Grün: Ausführbare oder erkannte Datendatei

Himmelblau: Verknüpfte Datei

Gelb mit schwarzem Hintergrund: Gerät

Pink: Grafikbilddatei

Rot: Archivdatei

Diese Dateien wurden vor dem Hochladen von verschiedenen Schriftarten auf einen Mac heruntergeladen.

Pranab
quelle
4
Die spezifischen Farben (blau, pink usw.) haben keine Bedeutung. Sie können die Farben so anpassen, wie Sie möchten. linux-sxs.org/housekeeping/lscolors.html Um die Farben für Ihr spezifisches System zu überprüfen, geben Sie $ LS_COLORS
beardedlinuxgeek
Zur Verdeutlichung ging es mir nicht wirklich um die Farben an sich, sondern darum zu verstehen, ob dies darauf hinweist, dass ich Probleme mit meinen Skripten / Code haben werde.
Pranab

Antworten:

13

ls -lwird Ihnen definitiv sagen, ob eine Datei ausführbar ist oder nicht. Ich glaube nicht, dass es hier ein großes Geheimnis gibt. Sie haben Dateien aus verschiedenen Quellen heruntergeladen, für die möglicherweise aus dem einen oder anderen Grund unterschiedliche Berechtigungsbits festgelegt wurden. * Wenn Sie einige nicht gerne mit Farben und andere ohne Versuch sehen möchten chmod -x *.ttf... Für Schriftdateien sollte das ausführbare Bit nicht gesetzt sein.

* In dem hoch bewerteten Kommentar von Matteo Italia, der beibehalten werden sollte, heißt es: Höchstwahrscheinlich wurden sie von einem FAT- oder NTFS-Volume kopiert, auf dem das ausführbare Bit nicht gespeichert ist. Sie werden daher standardmäßig bereitgestellt, sodass für alle Dateien das ausführbare Bit gesetzt ist .

B Schicht
quelle
1
Genau. Der einzige Unterschied zwischen einer regulären Datei, für die die Berechtigung 'ausführbar' festgelegt ist, und einer Datei, für die dies nicht der Fall ist, besteht darin, dass das Betriebssystem beim Versuch, die Datei über die Befehlszeile für eine Datei mit gesetztem x-Bit auszuführen, versucht, ein Programm zu verwenden, wenn Eine solche wird im System definiert, um diese Datei zu öffnen.
Gnudiff
2
@Pranab nein, für Schriftarten sollte es keinen Unterschied geben.
Gnudiff
1
@Pranab Ich bin froh, dass ich helfen konnte. Wenn ich an einem richtigen Computer mit Tastatur bin, werde ich versuchen, eine etwas informativere Antwort zu geben, damit ein breiterer Kontext verfügbar ist.
Gnudiff
1
Eigentlich möchte ich lieber niemanden irreführen, der nichts anderes weiß. Hier ist mein ursprünglicher Kommentar abzüglich der falschen Bits: Es gibt verschiedene Gründe, warum das Bit gesetzt werden könnte. Wenn irgendwo auf der Linie jemand das ausführbare Bit einschaltet, dann das könnte der Datei "folgen". (Dies setzt voraus, dass jede Person, die es kopiert, diese Originalteile beibehält.) Es ist auf jeden Fall ziemlich harmlos.
B-Schicht
12
Höchstwahrscheinlich wurden sie von einem FAT- oder NTFS-Volume kopiert, auf dem das ausführbare Bit nicht gespeichert ist. Sie werden daher standardmäßig bereitgestellt, sodass für alle Dateien das ausführbare Bit gesetzt ist .
Matteo Italia
6

Es scheint, dass der lsBefehl, den Sie ausführen, ein Alias ​​für istls --color

Mann ls

--color [= WHEN] koloriert die Ausgabe; WANN kann 'immer' (Standard, wenn weggelassen), 'auto' oder 'nie' sein; Weitere Infos unten

Sie können dies überprüfen, indem Sie den Ursprung ausführen ls:

  • Verwenden von Anführungszeichen:

    "ls" -a

  • Verwenden Sie den vollständigen Pfad (z. B. wenn sich der lsStandort befindet /bin/ls) und prüfen Sie, ob die Farben angezeigt werden oder nicht:

    / bin / ls -a

Hinweis: Beim Ausführen ls -lawerden Ihnen die Details der Dateien angezeigt, und Sie können die vollständigen Details jeder Datei anzeigen, sodass Sie die erwartete Ausgabe von überprüfen könnenls --color

Yaron
quelle
Es ist interessant, wie viele Möglichkeiten es gibt, um zum Kernbefehl zu gelangen. Die Surround-with-Quotes-Methode war mir nicht bekannt. Zumindest mit bash kann man dem Befehl auch einen Backslash voranstellen \ls -aoder den eingebauten 'Befehl' verwenden command ls -a. Wenn Sie sehen möchten, wie ein Befehl aufgelöst wird, anstatt ihn auszuführen, gibt es einen type -a ls.
B-Schicht
@BlairM. Die Anführungszeichen und Backslash-Methoden verhindern nur die Alias-Erweiterung. Sie haben keine Auswirkung, wenn Sie eine Shell-Funktion oder eine integrierte Funktion aufgerufen haben ls.
Shadowtalker
@ssdecontrol Richtig. Ich wollte nicht anders vorschlagen ... wir sprachen über Aliase in Bezug auf ls. Aber es sind gute Informationen.
B-Schicht
4

Die Farbe zeigt an, dass die Datei als "ausführbar" markiert ist *

Die ausführbaren Berechtigungsbits (eines für den Benutzer, eines für die Gruppe, eines für das andere) bedeuten, dass der Kernel, wenn der Name der Datei an einen der Exec-Systemaufrufe übergeben wird, fortfährt und versucht, ihn auszuführen.

Konvention ist, dass nur Dateien, die tatsächlich ausgeführt werden sollen, das ausführbare Bit gesetzt haben. Beim Verschieben / Kopieren von Dateien, insbesondere in einer Umgebung mit mehreren Plattformen, ist es jedoch leicht, versehentlich die ausführbaren Bits zu gewinnen oder zu verlieren.

Dateien, die auf einem Dateisystem gespeichert sind, das keine Unix-Berechtigungen (fat, ntfs usw.) unterstützt, werden dem System wahrscheinlich als ausführbar angezeigt. Wenn Sie diese Dateien mit einem Tool, das Berechtigungen beibehält, in ein Unix-Dateisystem verschieben oder kopieren, bleiben diese ausführbaren Bits erhalten.

Die Verwendung von Tools zum Verschieben von Dateien, die entweder keine Berechtigungen beibehalten können oder mit der Option zum Beibehalten nicht ausgewählter Berechtigungen verwendet werden, führt wahrscheinlich dazu, dass die Kopie nicht als ausführbar markiert wird, obwohl das Original vorhanden war.

Nachdem die ausführbaren Berechtigungsbits mit verschiedenen Tools auf verschiedenen Plattformen verschoben wurden, können sie in einem ziemlich willkürlichen Zustand enden.

* Ich bin nicht 100% sicher, wie ls mit dem Fall umgeht, in dem einige, aber nicht alle ausführbaren Bits gesetzt sind.

Plugwash
quelle
2

Wie bereits in früheren Antworten erwähnt, gibt die Farbgebung an, ob die Dateien als ausführbar angesehen werden oder nicht.

Die Berechtigung "Ausführen" (= Bit) unter Linux und den meisten anderen Unixen hat eine Bedeutung für Dateien und eine andere für Verzeichnisse.

Wenn Sie für Verzeichnisse über Ausführungsberechtigungen verfügen, können Sie deren Inhalt anzeigen. Wenn Sie dies nicht tun, können Sie weder eine CD in das Verzeichnis erstellen noch Dateien darin auflisten, selbst wenn Sie sowohl Lese- als auch Schreibzugriff auf das Verzeichnis haben.

Bei regulären Dateien (im Gegensatz zu Gerätedateien und anderen speziellen Unix-Dateitypen) bedeutet das Ausführungsbit, dass das Betriebssystem (oder genauer: die Shell) versucht, "auszuführen" oder auszuführen, wenn Sie den Dateinamen in der Befehlszeile verwenden die Datei als Befehl. Wenn Sie dagegen keine Ausführungsberechtigung für die Datei haben, können Sie sie nicht über die Befehlszeile ausführen.

Wenn Sie beispielsweise die x-Berechtigung von allen Benutzern in der Datei / bin / cat (bei der es sich um einen Unix-Befehl handelt) entfernen, schlagen Sie selbst oder andere Personen und jedes Programm, das versucht, den Befehl "cat" zu verwenden, fehl.

Dies sind dann die Betriebssystembefehle wie "cat" und "grep", die normalerweise ausführbare Dateien in / * / bin / Verzeichnissen - / bin, / usr / bin, / sbin, / usr / sbin usw. enthalten.

Und dann kann es nicht kompilierte, interpretierte Skripte geben, die entweder in einer Programmiersprache wie Python oder Shell-Skripten geschrieben sind (im Grunde Befehle, die Sie wie von der Kommandozeile aus schreiben, wenn Sie zum Server senden).

Wenn Sie nun das Ausführungsbit für die Skriptdatei (z. B. Datei foobar) setzen und versuchen, es von Ihrer Shell auszuführen: "./foobar", versucht die Shell, die Datei zu analysieren und das richtige Programm zum Übergeben des Skripts zu finden zu.

Dies tut die Shell, indem sie versucht, die erste Zeile der Datei zu lesen und die "shebang" -Notation des Programms zu finden, das ausgeführt werden soll.

Wenn Ihre Foobar also eine Textdatei mit der ersten Zeile wie folgt war:

#!/usr/bin/python

Dann würde die Shell versuchen, den Befehl: auszuführen /usr/bin/python foobar, indem sie im Grunde den Python-Interpreter aufruft und den Namen Ihrer Foobar-Datei als Python-Skript an sie übergibt.

Wenn die Shell eine solche erste Zeile in Ihrer Datei nicht finden würde, würde sie versuchen, foobar selbst so auszuführen, als ob sie Shell-Befehle enthalten würde.

Wenn die Datei mit dem ausführbaren Bit jedoch keine gültigen Shell-Befehle enthält, würde sich die Shell einfach beschweren.

Dies würde also passieren, wenn Sie TTF-Dateien mit gesetztem Exec-Bit haben und versuchen, es über die Befehlszeile auszuführen:

$./FreeMonoOblique.ttf
-bash: ./FreeMonoOblique.ttf: cannot execute binary file: Exec format error
$

Für Schriftarten ist es wahrscheinlich ordentlicher, wenn das Exec-Bit nicht gesetzt ist, aber nichts wirklich ändert.

PS Nur ein paar irrelevante Informationen. Wenn Sie das Ausführungsbit eines Befehls oder Skripts entfernen, wird es möglicherweise weiterhin als Argument an ein anderes Programm übergeben. Wenn dieses andere Programm weiß, wie Sie Ihren Befehl ausführen, war das Entfernen des Exec-Bits nicht wirklich wichtig. Zum Beispiel würde das foobar Python-Skript immer noch vom Python-Interpreter ausgeführt, wenn Sie dies einfach über die Befehlszeile tun würden:

$python foobar

Anstatt von

$./foobar

Gleiches gilt für das Beispiel der Systembefehle wie "cat". Wenn Sie das Exec-Bit von "cat" entfernen, können Sie es dennoch zur Ausführung an eine neue Shell-Instanz übergeben:

$sh -c 'cat myfile'

wird funktionieren, auch wenn Sie exec bit von cat und entfernt haben

$cat myfile

nicht.

Gnudiff
quelle
2
Auf meinem System zumindest unsetting die ausführbare Bit auf eine binäre ausführbare Datei wie catoder echonicht nicht Sie es über laufen lassen sh -c 'cat myfile', noch mit system("cat", "myfile")in Sprachen wie Ruby. Der Grund, warum Python nicht ausführbare .pyDateien ausführen kann , besteht darin, dass es sie als Textzeichenfolge einliest und dann einen Interpreter verwendet, damit sich dieser Text so verhält, als wäre er Code.
Ethan Kaminski
@ EthanKaminski Interessant. Ich erinnere mich deutlich daran, dass es bei mir funktioniert hat, muss aber die Details überprüfen.
Gnudiff
1
@Gnudiff Bei ausführbaren Binärdateien besteht der execveSystemaufruf auf einer Ausführungsberechtigung. Auf glibc-basierten Systemen können Sie den dynamischen Linker als Programm aufrufen, um ungefähr den gleichen Effekt wie eine shebang-Zeile ( /lib64/ld-linux-x86-64.so.2 /bin/cat) zu erzielen. Dies funktioniert bei mir auch dann, wenn die Datei in der Befehlszeile nicht ausführbar ist, dies aber sh -c catnicht tut für dich.
zwol
Es ist nicht die Shell, die bestimmt, ob und wie eine Datei ausgeführt wird, sondern der Kernel. Die Shell übergibt nur den Namen und die Parameter der ausführbaren Datei an den Kernel.
Plugwash