couleurs ls: pourquoi certaines de mes polices sont-elles noires et d'autres vertes dans la sortie ls

10

J'ai téléchargé des fichiers de polices sur AWS (exécutant Amazon Linux) et les ai déplacés vers le /usr/share/fontsrépertoire à l'aide d'une cpcommande dans .ebextensions.

Lorsque je me connecte depuis mon Mac et que j'utilise ls -a, je vois que certains fichiers sont colorés différemment - un ensemble de fichiers de polices est noir tandis que d'autres sont verts. Je suis curieux de savoir pourquoi cela a été le cas et si cela créera des problèmes pour mon code .

répertoire des polices sur Elastic Beanstalk exécutant AWS Linux

ls -la capture d'écran

À partir d' une autre réponse sur AskUbuntu, j'ai trouvé cette clé sur la façon d'interpréter ces couleurs. Je ne comprends pas pourquoi un .ttf serait exécutable ou pourquoi un ensemble de .ttfs serait reconnu et pas un autre.

Bleu: Annuaire

Vert: fichier de données exécutable ou reconnu

Sky Blue: fichier lié

Jaune sur fond noir: appareil

Rose: fichier image graphique

Rouge: fichier d'archive

Ces fichiers ont tous été téléchargés sur un Mac à partir de divers sites de polices avant d'être téléchargés.

Pranab
la source
5
Les couleurs spécifiques (bleu, rose, etc.) ne veulent rien dire. Vous pouvez personnaliser les couleurs selon vos envies. linux-sxs.org/housekeeping/lscolors.html Pour vérifier les couleurs de votre système spécifique, faites écho à $ LS_COLORS
beardedlinuxgeek
Pour clarifier, mon intention n'était pas vraiment sur les couleurs en soi, mais pour comprendre si cela indique que je rencontrerai des problèmes avec mes scripts / code.
Pranab

Réponses:

13

ls -lvous dira définitivement si un fichier est exécutable ou non. Je ne pense pas qu'il y ait un grand mystère ici. Vous avez téléchargé des fichiers à partir de diverses sources, chacune pouvant avoir des bits d'autorisation différents définis pour une raison ou une autre. * Si vous n'aimez pas voir certains avec des couleurs et d'autres sans essayer chmod -x *.ttf... les fichiers de polices ne devraient pas avoir besoin du jeu de bits exécutables.

* Comme le commentaire hautement surévalué de Matteo Italia, qui devrait être conservé, dit: Très probablement, ils ont été copiés à partir d'un volume FAT ou NTFS, qui ne stockent pas le bit exécutable, sont donc montés par défaut afin que tous les fichiers aient le bit exécutable défini .

Couche B
la source
1
Exactement. La seule différence entre un fichier normal qui a un jeu d'autorisations «exécutable» et un autre qui ne l'est pas, c'est que lorsque vous essayez d'exécuter le fichier à partir de la ligne de commande, pour un fichier avec x bits définis, le système d'exploitation essaiera d'utiliser un programme, si tout tel est défini dans le système, pour ouvrir ce fichier.
Gnudiff
2
@Pranab non, pour les polices il ne devrait pas y avoir de différence.
Gnudiff
1
@Pranab Heureux d'avoir pu aider. Lorsque je serai devant un ordinateur approprié avec un clavier, j'essaierai de faire une réponse un peu plus informative, afin qu'il y ait un contexte plus large disponible.
Gnudiff
1
En fait, je préfère ne pas induire en erreur quelqu'un qui ne sait pas le contraire, alors voici mon commentaire d'origine moins les mauvais bits: il y a diverses raisons pour lesquelles le bit peut être défini ... si, le long de la ligne, quelqu'un active le bit exécutable, pourrait "suivre" le fichier. (Cela suppose que chaque personne qui le copie conserve ces bits originaux.) C'est à peu près inoffensif dans tous les cas.
B Layer
12
Très probablement, ils ont été copiés à partir d'un volume FAT ou NTFS, qui ne stockent pas le bit exécutable, ils sont donc montés par défaut afin que tous les fichiers aient le bit exécutable défini .
Matteo Italia
6

Il semble que la lscommande que vous exécutez soit un alias pourls --color

homme ls

--color [= WHEN] colorise la sortie; QUAND peut être «toujours» (par défaut si omis), «auto» ou «jamais»; plus d'informations ci-dessous

Vous pouvez le vérifier en exécutant l'origine ls:

  • Utilisation de guillemets:

    "ls" -a

  • Utiliser le chemin complet (par exemple si l' lsemplacement est /bin/lsdedans) et voir s'il montre les couleurs ou non:

    / bin / ls -a

Remarque: l'exécution ls -lavous montrera les détails des fichiers, et vous pourrez voir tous les détails de chaque fichier, ce qui vous permettra de vérifier avec la sortie attendue dels --color

Yaron
la source
Il est intéressant de voir combien de façons il existe pour accéder à la commande principale. Je n'étais pas au courant de la méthode surround-with-quotes. Au moins avec bash, on peut également précéder la commande avec barre oblique inverse, \ls -aou utilisez la commande intégrée de commande ', command ls -a. Si vous voulez voir comment une commande se résout, plutôt que de l'exécuter, c'est le cas type -a ls.
B Layer
@BlairM. les méthodes de guillemets et de barre oblique inverse empêchent uniquement l'expansion d'alias. Ils n'auront aucun effet si vous avez une fonction shell ou intégrée appelée ls.
shadowtalker
@ssdecontrol À droite. Je ne voulais pas suggérer le contraire ... nous parlions d'alias par rapport à ls. Mais c'est une bonne information.
B Layer
4

La couleur indique que le fichier est marqué comme "exécutable" *

Les bits d'autorisation exécutables (un pour l'utilisateur, un pour le groupe, un pour l'autre) signifient que si le nom du fichier est transmis à l'un des appels système exec, le noyau ira de l'avant et essaiera de l'exécuter.

La convention est que seuls les fichiers qui sont réellement destinés à être exécutés ont le bit exécutable défini. Cependant, lors du déplacement / copie de fichiers, en particulier dans un environnement multiplateforme, il est facile de gagner ou de perdre par inadvertance les bits exécutables.

Les fichiers stockés sur un système de fichiers qui ne prend pas en charge les autorisations Unix (fat, ntfs, etc.) sont susceptibles d'apparaître sur le système comme exécutables. Le déplacement ou la copie de ces fichiers vers un système de fichiers Unix à l'aide d'un outil qui préserve les autorisations préservera alors ces bits exécutables.

D'un autre côté, l'utilisation d'outils pour déplacer des fichiers qui ne peuvent pas conserver les autorisations ou qui sont utilisés avec l'option de conservation des autorisations désélectionnées risque de ne pas marquer la copie comme exécutable même si l'original l'a été.

Ainsi, après avoir été déplacé sur diverses plates-formes à l'aide d'une variété d'outils, les bits d'autorisation exécutables peuvent se retrouver dans un état assez arbitraire.

* Je ne suis pas sûr à 100% de la façon dont ls gère le cas où certains mais pas tous les bits exécutables sont définis.

plugwash
la source
2

Comme indiqué dans les réponses précédentes, la coloration consiste à indiquer si les fichiers sont considérés comme exécutables ou non.

L'autorisation "exécuter" (= bit) sous Linux et la plupart des autres Unix a une signification pour les fichiers et une autre pour les répertoires.

Pour les répertoires, si vous y êtes autorisé à exécuter, vous pouvez voir son contenu. Si vous ne le faites pas, vous ne pouvez pas accéder au répertoire dans le répertoire, ni y lister les fichiers, même si vous disposez d'un accès en lecture et en écriture au répertoire.

Pour les fichiers normaux (par opposition aux fichiers de périphérique et à d'autres types de fichiers Unix spéciaux), le bit d'exécution signifie que si vous utilisez le nom de fichier sur la ligne de commande, le O / S (ou plus précisément: shell) essaiera d'exécuter ou d'exécuter le fichier en tant que commande. Inversement, si vous ne disposez pas de l'autorisation d'exécution sur le fichier, vous ne pouvez pas l'exécuter à partir de la ligne de commande.

Ainsi, si vous, par exemple, supprimez l'autorisation x de tous les utilisateurs du fichier / bin / cat (qui est une commande Unix), vous-même ou quelqu'un d'autre et tout programme qui essaie d'utiliser la commande "cat" échouera.

Ce sont alors les commandes du système d'exploitation, telles que "cat" et "grep", qui ont généralement des fichiers exécutables dans les répertoires / * / bin / - / bin, / usr / bin, / sbin, / usr / sbin etc.

Et puis il peut y avoir des scripts interprétés non compilés, qui sont soit écrits dans certains langages de programmation, tels que Python ou des scripts shell (en gros, les commandes que vous écrivez comme si à partir de la ligne de commande lors de la transmission au serveur).

Maintenant, lorsque vous définissez le bit d'exécution sur le fichier de script (par exemple, le fichier foobar) et essayez de l'exécuter par votre shell: "./foobar", le shell essaie d'analyser le fichier et de trouver le programme approprié pour passer le script à.

Le shell le fait en essayant de lire la première ligne du fichier et en trouvant la notation "shebang" du programme que cela est censé exécuter.

Donc, si votre foobar était un fichier texte avec la première ligne comme ceci:

#!/usr/bin/python

Ensuite, le shell essaierait d'exécuter la commande /usr/bin/python foobar:, invoquant essentiellement l'interpréteur python et lui passant le nom de votre fichier foobar en tant que script Python.

Si shell ne trouve pas une telle première ligne dans votre fichier, il essaiera alors d'exécuter foobar lui-même comme s'il contenait des commandes shell.

Si le fichier avec un bit exécutable ne contient pas de commandes shell valides, le shell se plaindra simplement.

C'est donc ce qui se passerait, si vous avez des fichiers TTF avec un bit exécutable défini et que vous essayez de l'exécuter à partir de la ligne de commande:

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

Donc, pour les polices, c'est probablement plus propre, si le bit exec n'est pas défini, mais ne change vraiment rien.

PS Juste quelques informations superflues. Si vous supprimez le bit d'exécution d'une commande ou d'un script, il peut toujours être transmis à tout autre programme en tant qu'argument. Si cet autre programme sait comment exécuter votre commande, la suppression du bit d'exécution n'a pas vraiment d'importance. Par exemple, le script foobar Python serait toujours exécuté par l'interpréteur Python, si vous le faisiez simplement à partir de la ligne de commande:

$python foobar

au lieu de

$./foobar

Idem avec l'exemple des commandes système, telles que "cat". Si vous supprimez le bit d'exécution de "cat", vous pouvez toujours le passer à une nouvelle instance de shell pour exécution:

$sh -c 'cat myfile'

fonctionnera, même si vous avez supprimé le bit d'exécution de cat et

$cat myfile

non.

Gnudiff
la source
2
Sur mon système, au moins, la suppression du bit exécutable sur un fichier exécutable binaire comme catou echone vous permet pas de l' exécuter via sh -c 'cat myfile', ni avec des system("cat", "myfile")langages comme Ruby. La raison pour laquelle Python peut exécuter des .pyfichiers non exécutables est qu'il les lit comme une chaîne de texte, puis utilise un interpréteur pour que ce texte se comporte comme s'il s'agissait de code.
Ethan Kaminski
@EthanKaminski Intéressant. Je me souviens clairement que cela fonctionnait pour moi, mais je devrai vérifier les détails.
Gnudiff
1
@Gnudiff Pour les exécutables binaires, l' execveappel système insiste sur l'autorisation d'exécution. Sur les systèmes basés sur la glibc, vous pouvez invoquer l'éditeur de liens dynamique en tant que programme pour obtenir approximativement le même effet qu'une ligne shebang ( /lib64/ld-linux-x86-64.so.2 /bin/cat) et cela fonctionne pour moi même si le fichier sur la ligne de commande n'est pas exécutable, mais sh -c catne le fera pas. pour vous.
zwol
Ce n'est pas le shell qui détermine si et comment exécuter un fichier, c'est le noyau. Le shell passe juste le nom et les paramètres de l'exécutable au noyau.
plugwash