Kolory ls: dlaczego niektóre z moich czcionek są czarne, a inne zielone na wyjściu ls

10

Przesłałem niektóre pliki czcionek do AWS (z systemem Amazon Linux) i przeniosłem je do /usr/share/fontskatalogu za pomocą cppolecenia w .ebextensions.

Kiedy korzystam z SSH na moim komputerze Mac i używam ls -a, widzę, że niektóre pliki mają różne kolory - jeden zestaw plików czcionek jest czarny, a inne są zielone. Jestem ciekawy, co spowodowało, że tak się stało i czy spowoduje to problemy w moim kodzie .

katalog czcionek na Elastic Beanstalk z systemem AWS Linux

Zrzut ekranu ls -la

Z innej odpowiedzi na AskUbuntu znalazłem klucz do interpretacji tych kolorów. Nie rozumiem, dlaczego plik .ttf byłby wykonywalny ani dlaczego jeden zestaw plików .ttf zostałby rozpoznany, a nie inny.

Niebieski: katalog

Zielony: plik wykonywalny lub rozpoznany

Sky Blue: połączony plik

Żółty z czarnym tłem: urządzenie

Różowy: plik obrazu graficznego

Czerwony: plik archiwum

Wszystkie pliki zostały przesłane do komputera Mac z różnych stron czcionek przed przesłaniem.

Pranab
źródło
5
Konkretne kolory (niebieski, różowy itp.) Nic nie znaczą. Możesz dostosować kolory do swoich potrzeb. linux-sxs.org/housekeeping/lscolors.html Aby sprawdzić kolory dla konkretnego systemu, wykonaj echo $ LS_COLORS
beardedlinuxgeek
Aby to wyjaśnić, moim zamiarem nie było tak naprawdę kolory jako takie, ale zrozumienie, czy to oznacza, że ​​napotkam jakiekolwiek problemy z moimi skryptami / kodem.
Pranab

Odpowiedzi:

13

ls -lpowie ci definitywnie, czy plik jest wykonywalny, czy nie. Nie sądzę, żeby była tu jakaś wielka tajemnica. Pobrałeś pliki z różnych źródeł, z których każde mogło mieć ustawione różne bity uprawnień z tego czy innego powodu. * Jeśli nie lubisz widzieć niektórych z kolorami, a innych bez próbowania chmod -x *.ttf... pliki czcionek nie powinny wymagać zestawu bitów wykonywalnych.

* Jak wysoko oceniany komentarz Matteo Italia, który należy zachować, mówi: Najprawdopodobniej zostały one skopiowane z woluminu FAT lub NTFS, które nie przechowują bitu wykonywalnego, więc są montowane domyślnie, tak aby wszystkie pliki miały ustawiony bit wykonywalny .

Warstwa B.
źródło
1
Dokładnie. Jedyną różnicą między zwykłym plikiem z ustawionymi uprawnieniami „wykonywalnymi”, a tym, który go nie ma, jest to, że kiedy próbujesz uruchomić plik z wiersza poleceń, w przypadku pliku z ustawionym bitem x system operacyjny spróbuje użyć programu, jeśli każdy taki jest zdefiniowany w systemie, aby otworzyć ten plik.
Gnudiff
2
@Pranab nie, w przypadku czcionek nie powinno być żadnej różnicy.
Gnudiff
1
@Pranab Cieszę się, że mogłem pomóc. Kiedy jestem na odpowiednim komputerze z klawiaturą, postaram się udzielić nieco bardziej pouczającej odpowiedzi, aby uzyskać szerszy kontekst.
Gnudiff
1
Właściwie wolę nie wprowadzać w błąd kogoś, kto nie wie inaczej, więc oto mój oryginalny komentarz minus złe bity: Istnieje wiele powodów, dla których bit można ustawić .. jeśli gdziekolwiek w linii ktoś włącza bit wykonywalny, to może „śledzić” plik dookoła. (Zakłada się, że każda osoba, która go skopiuje, zachowuje oryginalne fragmenty.) W każdym razie jest to prawie nieszkodliwe.
B Layer
12
Najprawdopodobniej zostały one skopiowane z woluminu FAT lub NTFS, które nie przechowują bitu wykonywalnego, więc są domyślnie montowane, aby wszystkie pliki miały ustawiony bit wykonywalny .
Matteo Italia,
6

Wygląda na to, lsże wykonywane polecenie jest aliasemls --color

człowiek ls

--kolor [= KIEDY] pokoloruj wydruk; KIEDY może być „zawsze” (domyślnie, jeśli pominięto), „auto” lub „nigdy”; więcej informacji poniżej

Możesz to sprawdzić, uruchamiając źródło ls:

  • Za pomocą cytatów:

    „ls” -a

  • Używając pełnej ścieżki (np. Jeśli lslokalizacja jest w środku /bin/ls) i sprawdź, czy pokazuje kolory, czy nie:

    / bin / ls -a

Uwaga: uruchomione ls -lapokaże szczegóły plików, a będziesz mógł zobaczyć pełne szczegóły każdego pliku, co pozwoli ci sprawdzić z oczekiwanymi danymi wyjściowymils --color

Yaron
źródło
Ciekawe, ile jest sposobów, aby dostać się do głównego polecenia. Nie wiedziałem o metodzie surround z cytatami. Przynajmniej w przypadku bash można również poprzedzić polecenie odwrotnym ukośnikiem \ls -alub użyć wbudowanego polecenia command ls -a. Jeśli chcesz zobaczyć, jak polecenie jest rozwiązywane, zamiast je uruchamiać, jest type -a ls.
B Layer
@BlairM. metody cytowania i odwrotnego ukośnika zapobiegają tylko rozszerzaniu aliasów. Nie będą miały żadnego efektu, jeśli masz wywołaną funkcję powłoki lub wbudowaną funkcję ls.
shadowtalker
@ssdecontrol Right. Nie chciałem sugerować inaczej ... rozmawialiśmy o aliasach w odniesieniu do ls. Ale to dobra informacja.
B Layer
4

Kolor wskazuje, że plik jest oznaczony jako „wykonywalny” *

Bity uprawnień do wykonywania (jeden dla użytkownika, jeden dla grupy, jeden dla drugiego) oznaczają, że jeśli nazwa pliku zostanie przekazana do jednego z wywołań systemu exec, jądro przejdzie i spróbuje go wykonać.

Konwencja polega na tym, że tylko pliki, które są rzeczywiście przeznaczone do egzekucji, mają ustawiony bit wykonywalny. Jednak podczas przenoszenia / kopiowania plików, szczególnie w środowisku wieloplatformowym, łatwo jest przypadkowo uzyskać lub stracić bity wykonywalne.

Pliki przechowywane w systemie plików, który nie obsługuje uprawnień uniksowych (fat, ntfs itp.), Mogą pojawić się w systemie jako pliki wykonywalne. Przeniesienie lub skopiowanie tych plików do systemu plików UNIX za pomocą narzędzia, które zachowuje uprawnienia, pozwoli zachować te bity wykonywalne.

Z drugiej strony użycie narzędzi do przenoszenia plików, które albo nie mogą zachować uprawnień, albo są używane z opcją zachowania uprawnień niezaznaczonymi, prawdopodobnie spowoduje, że kopia nie zostanie oznaczona jako wykonywalna, nawet jeśli oryginał był.

Więc po przeniesieniu na różne platformy za pomocą różnych narzędzi, bity uprawnień do wykonywania mogą skończyć się w dość arbitralnym stanie.

* Nie jestem w 100% pewien, jak ls obsługuje przypadek, w którym ustawione są niektóre, ale nie wszystkie bity wykonywalne.

płyn do płukania
źródło
2

Jak wspomniano w poprzednich odpowiedziach, kolorowanie ma wskazywać, czy pliki są uznawane za pliki wykonywalne, czy nie.

Uprawnienie do „wykonywania” (= bit) w Linuksie i większości innych Uniksów ma jedno znaczenie dla plików, a drugie dla katalogów.

W przypadku katalogów, jeśli masz do niego uprawnienia, możesz zobaczyć jego zawartość. Jeśli tego nie zrobisz, nie możesz cd do katalogu, ani nie możesz wyświetlić w nim plików, nawet jeśli masz zarówno dostęp do odczytu i zapisu do katalogu.

W przypadku zwykłych plików (w przeciwieństwie do plików urządzeń i innych specjalnych typów plików uniksowych) bit wykonania oznacza, że ​​jeśli użyjesz nazwy pliku w wierszu poleceń, O / S (a ściślej: shell) spróbuje „wykonać” lub uruchomić plik jako polecenie. I odwrotnie, jeśli nie masz uprawnień do wykonania pliku, nie możesz go uruchomić z wiersza poleceń.

Tak więc, jeśli na przykład usuniesz uprawnienie x od wszystkich użytkowników w pliku / bin / cat (które jest poleceniem uniksowym), ty sam lub ktokolwiek inny, a dowolny program, który spróbuje użyć polecenia „cat”, zawiedzie.

Są to wtedy polecenia systemu operacyjnego, takie jak „cat” i „grep”, które zwykle mają pliki wykonywalne w / * / bin / directories - / bin, / usr / bin, / sbin, / usr / sbin itp.

I wtedy mogą istnieć nieskompilowane, interpretowane skrypty, które są albo napisane w jakimś języku programowania, takim jak Python lub skrypty powłoki (w zasadzie polecenia, które piszesz jakby z linii poleceń podczas sshing na serwer).

Teraz, gdy ustawisz bit wykonania na pliku skryptu (na przykład plik foobar) i spróbujesz wykonać go za pomocą powłoki: „./foobar”, powłoka próbuje przeanalizować plik i znaleźć odpowiedni program do przekazania skryptu do.

Robi to powłoka, próbując odczytać pierwszy wiersz pliku i znaleźć notację „shebang”, który program ma uruchomić.

Więc jeśli twój foobar był plikiem tekstowym z pierwszym wierszem w ten sposób:

#!/usr/bin/python

Następnie powłoka spróbuje wykonać polecenie: /usr/bin/python foobarw zasadzie wywołując interpreter Pythona i przekazując mu nazwę pliku foobar jako skrypt Pythona.

Jeśli powłoka nie znajdzie takiej pierwszej linii w twoim pliku, wówczas spróbuje wykonać foobar, tak jakby zawierał polecenia powłoki.

Jeśli plik z bitem wykonywalnym nie zawiera prawidłowych poleceń powłoki, powłoka po prostu narzeka.

Tak by się stało, gdybyś miał pliki TTF z ustawionym bitem exec i próbował uruchomić go z wiersza poleceń:

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

Tak więc w przypadku czcionek jest to prawdopodobnie fajniejsze, jeśli bit exec nie jest ustawiony, ale tak naprawdę niczego nie zmienia.

PS Kilka dodatkowych informacji. Jeśli usuniesz bit wykonania z jakiegoś polecenia lub skryptu, może on zostać przekazany do dowolnego innego programu jako argument. Jeśli ten inny program wie, jak wykonać polecenie, usunięcie bitu exec naprawdę nie miało znaczenia. Na przykład, foobarowy skrypt Python nadal byłby uruchamiany przez interpreter Pythona, gdybyś po prostu zrobił to z linii poleceń:

$python foobar

zamiast

$./foobar

To samo z przykładem poleceń systemowych, takich jak „cat”. Jeśli usuniesz bit exec z „cat”, nadal możesz przekazać go do nowej instancji powłoki w celu wykonania:

$sh -c 'cat myfile'

będzie działać, nawet jeśli usunąłeś bit exec z cat i

$cat myfile

nie.

Gnudiff
źródło
2
Przynajmniej w moim systemie, rozbrojenie bitu wykonywalnego na binarnym pliku wykonywalnym, takim jak catlub echo, nie pozwala na uruchomienie go sh -c 'cat myfile', ani system("cat", "myfile")w językach takich jak Ruby. Powodem, dla którego Python może uruchamiać .pypliki niewykonywalne , jest to, że wczytuje je jako ciąg tekstowy, a następnie używa interpretera, aby tekst zachowywał się jak kod.
Ethan Kamiński
@EthanKamiński Interesujące. Wyraźnie pamiętam, że to dla mnie działało, ale będę musiał sprawdzić szczegóły.
Gnudiff
1
@Gnudiff W przypadku plików binarnych execvewywołanie systemowe nalega na pozwolenie na wykonanie. W systemach opartych na glibc możesz wywołać dynamiczny linker jako program, aby uzyskać w przybliżeniu taki sam efekt jak linia shebang ( /lib64/ld-linux-x86-64.so.2 /bin/cat) i działa to dla mnie, nawet jeśli plik w wierszu poleceń nie jest wykonywalny, alesh -c cat nie zrobi tego dla Was.
zwolnienie
To nie powłoka decyduje o tym, czy i jak wykonać plik, to jądro. Powłoka po prostu przekazuje do jądra nazwę pliku wykonywalnego i parametry.
płyn do płukania