Sono i colori: perché alcuni dei miei caratteri sono neri e altri verdi nell'output


10

Ho caricato alcuni file di caratteri su AWS (con Amazon Linux) e li ho spostati nella /usr/share/fontsdirectory usando un cpcomando in .ebextensions.

Quando utilizzo SSH dal mio Mac e utilizzo ls -a, vedo alcuni file colorati in modo diverso: un set di file di caratteri è nero mentre altri sono verdi. Sono curioso di sapere cosa l'abbia causato e se ciò creerà problemi al mio codice .

directory dei caratteri su Elastic Beanstalk con AWS Linux

Schermata di ls -la

Da un'altra risposta su AskUbuntu ho trovato questa chiave su come interpretare questi colori. Non riesco a capire perché un .ttf sia eseguibile o perché un set di .ttfs venga riconosciuto e non un altro.

Blu: directory

Verde: file di dati eseguibile o riconosciuto

Sky Blue: file collegato

Giallo con sfondo nero: dispositivo

Rosa: file di immagine grafica

Rosso: file di archivio

Questi file sono stati tutti scaricati su un Mac da vari siti di font prima del caricamento.


5
I colori specifici (blu, rosa, ecc.) Non significano nulla. È possibile personalizzare i colori per essere quello che vuoi. linux-sxs.org/housekeeping/lscolors.html Per verificare i colori per il tuo sistema specifico, fai eco $ LS_COLORS
beardedlinuxgeek il

Per chiarire, il mio intento non riguardava davvero i colori in sé, ma capire se questo indica che avrò problemi con i miei script / codice.
Pranab,

Risposte:


13

ls -lti dirà definitivamente se un file è eseguibile o meno. Non penso che ci sia un grande mistero qui. Hai scaricato file da varie fonti, ognuno dei quali potrebbe aver impostato bit di autorizzazione diversi per un motivo o per l'altro. * Se non ti piace vedere alcuni con i colori e altri senza provare chmod -x *.ttf... i file dei caratteri non dovrebbero aver bisogno del set di bit eseguibile.

* Come dice il commento altamente positivo di Matteo Italia, che dovrebbe essere preservato, dice: Molto probabilmente sono stati copiati da un volume FAT o NTFS, che non memorizza il bit eseguibile, quindi sono montati di default in modo che tutti i file abbiano il bit eseguibile impostato .


1
Esattamente. L'unica differenza tra un file normale con set di autorizzazioni "eseguibile" e uno che non lo è è che quando si tenta di eseguire il file dalla riga di comando, per il file con set di bit x, il sistema operativo tenterà di utilizzare un programma, se qualsiasi tale è definito nel sistema, per aprire quel file.
Gnudiff,

2
@Pranab no, per i caratteri non dovrebbe esserci alcuna differenza.
Gnudiff,

1
@Pranab Sono contento di poterti aiutare. Quando sono su un vero computer con tastiera, cercherò di dare una risposta un po 'più istruttiva, in modo che sia disponibile un contesto più ampio.
Gnudiff,

1
In realtà, preferirei non fuorviare qualcuno che non lo sapesse altrimenti, quindi ecco il mio commento originale meno i bit sbagliati: ci sono vari motivi per cui il bit potrebbe essere impostato ... se in qualsiasi parte della linea qualcuno attiva il bit eseguibile, allora quello potrebbe "seguire" il file in giro. (Ciò presume che ogni persona che lo copia conserva quei pezzi originali.) È praticamente innocuo in ogni caso.
B Layer

12
Molto probabilmente sono stati copiati da un volume FAT o NTFS, che non memorizza il bit eseguibile, quindi sono montati per impostazione predefinita in modo che tutti i file abbiano il bit eseguibile impostato .
Matteo Italia,

6

Sembra che il lscomando che stai eseguendo sia un alias perls --color

uomo ls

--color [= QUANDO] colorizza l'output; QUANDO può essere "sempre" (impostazione predefinita se omesso), "auto" o "mai"; maggiori informazioni di seguito

Puoi verificarlo eseguendo l'origine ls:

  • Usando le virgolette:

    "ls" -a

  • Utilizzando il percorso completo (ad esempio se la lsposizione è in /bin/ls) e vedere se mostra i colori o meno:

    / bin / ls -a

Nota: l'esecuzione ls -lati mostrerà i dettagli dei file e sarai in grado di vedere i dettagli completi di ciascun file, che ti permetterà di verificare con l'output atteso dils --color


È interessante quanti modi ci sono per arrivare al comando principale. Non ero a conoscenza del metodo surround con virgolette. Almeno con bash, si può anche far precedere il comando con barra rovesciata, \ls -aoppure utilizzare la funzione interna 'comando', command ls -a. Se vuoi vedere come si risolve un comando, piuttosto che eseguirlo, c'è type -a ls.
B Layer

@BlairM. i metodi di virgolette e barra rovesciata impediscono solo l'espansione dell'alias. Non avranno alcun effetto se si dispone di una funzione shell o di un builtin chiamato ls.
Shadowtalker,

@ssdecontrol Right. Non intendevo suggerire altrimenti ... stavamo parlando di alias rispetto a ls. Ma è una buona informazione.
B Layer,

4

Il colore indica che il file è contrassegnato come "eseguibile" *

I bit di autorizzazione eseguibili (uno per utente, uno per gruppo, uno per altro) indicano che se il nome del file viene passato a una delle chiamate del sistema exec il kernel andrà avanti e proverà ad eseguirlo.

La convenzione è che solo i file che si intende effettivamente eseguire hanno il bit eseguibile impostato. Tuttavia, quando si spostano / copiano file, specialmente in un ambiente multipiattaforma, è facile ottenere o perdere inavvertitamente i bit eseguibili.

I file memorizzati su un file system che non supporta le autorizzazioni unix (fat, ntfs ecc.) Appariranno probabilmente sul sistema come eseguibili. Lo spostamento o la copia di questi file su un filesystem unix mediante uno strumento che conserva le autorizzazioni conserverà quindi quei bit eseguibili.

D'altra parte, l'utilizzo di strumenti per spostare file che non possono conservare le autorizzazioni o che vengono utilizzati con l'opzione per preservare le autorizzazioni deselezionate può comportare che la copia non venga contrassegnata come eseguibile anche se l'originale era.

Quindi, dopo essere stati spostati su una varietà di piattaforme utilizzando una varietà di strumenti, i bit di autorizzazione eseguibili possono finire in uno stato abbastanza arbitrario.

* Non sono sicuro al 100% di come gestisce il caso in cui sono impostati alcuni ma non tutti i bit eseguibili.


2

Come già detto in precedenza, la colorazione indica se i file sono considerati eseguibili o meno.

L'autorizzazione "esegui" (= bit) in Linux e nella maggior parte degli altri Unix ha un significato per i file e un altro per le directory.

Per le directory, se si dispone dell'autorizzazione di esecuzione, è possibile visualizzarne il contenuto. In caso contrario, non è possibile eseguire il cd nella directory, né è possibile elencare i file in essa contenuti, anche se si dispone sia dell'accesso in lettura che in quello alla scrittura.

Per i file regolari (a differenza dei file di dispositivo e di altri tipi di file Unix speciali), il bit di esecuzione indica che se si utilizza il nome file sulla riga di comando, l'O / S (o più precisamente: shell) proverà a "eseguire" o eseguire il file come comando. Al contrario, se non si dispone dell'autorizzazione di esecuzione per il file, non è possibile eseguirlo dalla riga di comando.

Quindi, se, ad esempio, rimuovete l'autorizzazione x da tutti gli utenti sul file / bin / cat (che è un comando Unix) voi stessi o chiunque altro e qualsiasi programma che tenta di usare il comando "cat" fallirà.

Questi sono quindi i comandi del sistema operativo, come "cat" e "grep", che hanno normalmente file eseguibili in / * / bin / directory - / bin, / usr / bin, / sbin, / usr / sbin ecc.

E poi ci possono essere script interpretati non compilati, che sono scritti in qualche linguaggio di programmazione, come Python o script di shell (fondamentalmente, comandi che scrivi come da linea di comando quando si invia al server).

Ora, quando si imposta il bit di esecuzione sul file di script (ad esempio, il file foobar) e si tenta di eseguirlo con la shell: "./foobar", la shell tenta di analizzare il file e trovare il programma corretto per passare lo script per.

Questo fa la shell provando a leggere la prima riga del file e trovando la notazione "shebang" di quale programma dovrebbe essere eseguito.

Quindi, se il tuo foobar era un file di testo con la prima riga in questo modo:

#!/usr/bin/python

Quindi la shell tenterebbe di eseguire il comando /usr/bin/python foobar:, fondamentalmente invocando l'interprete python e passandogli il nome del tuo file foobar come script Python.

Se la shell non trova tale prima riga nel tuo file, tenta quindi di eseguire foobar come se contenesse i comandi della shell.

Se il file con bit eseguibile non contiene comandi di shell validi, la shell si lamenterebbe semplicemente.

Quindi questo è ciò che accadrebbe, se si hanno file TTF con il bit exec impostato e si tenta di eseguirlo dalla riga di comando:

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

Quindi, per i caratteri, è probabilmente più ordinato, se il bit exec non è impostato, ma non cambia nulla.

PS Solo alcune informazioni estranee. Se rimuovi il bit di esecuzione su un comando o uno script, potrebbe comunque essere passato a qualsiasi altro programma come argomento. Se quell'altro programma lo sa, come eseguire il comando, la rimozione di exec bit non ha importanza. Ad esempio, lo script Python foobar verrebbe comunque eseguito dall'interprete Python, se lo facessi semplicemente dalla riga di comando:

$python foobar

invece di

$./foobar

Lo stesso con l'esempio dei comandi di sistema, come "cat". Se si rimuove il bit exec da "cat", è comunque possibile passarlo a una nuova istanza della shell per l'esecuzione:

$sh -c 'cat myfile'

funzionerà, anche se hai rimosso exec bit da cat e

$cat myfile

non lo fa.


2
Sul mio sistema, almeno, azzerare il bit eseguibile su un file eseguibile binario come cato echonon ti consente di eseguirlo sh -c 'cat myfile', né con system("cat", "myfile")in lingue come Ruby. Il motivo per cui Python può eseguire .pyfile non eseguibili è perché li legge come una stringa di testo e quindi utilizza un interprete per far sì che quel testo si comporti come se fosse un codice.
Ethan Kaminski,

@EthanKaminski Interessante. Ricordo distintamente che ha funzionato per me, ma dovrò controllare i dettagli.
Gnudiff,

1
@Gnudiff Per gli eseguibili binari, la execvechiamata di sistema insiste sull'autorizzazione di esecuzione. Sui sistemi basati su glibc puoi invocare il linker dinamico come programma per ottenere approssimativamente lo stesso effetto di una riga shebang ( /lib64/ld-linux-x86-64.so.2 /bin/cat) e questo funziona per me anche se il file sulla riga di comando non è eseguibile, ma sh -c catnon lo farà per te.
zwol,

Non è la shell che determina se e come eseguire un file, è il kernel. La shell passa semplicemente il nome eseguibile e i parametri al kernel.
lavaggio:
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.