ls warna: mengapa beberapa font saya hitam dan yang lain hijau di ls output

10

Saya mengunggah beberapa file font ke AWS (menjalankan Amazon Linux) dan memindahkannya ke /usr/share/fontsdirektori menggunakan cpperintah dalam ekstensi.

Ketika saya SSH masuk dari mac saya dan menggunakan ls -a, saya melihat beberapa file berwarna berbeda - satu set file font berwarna hitam sementara yang lain berwarna hijau. Saya ingin tahu apa yang menyebabkan hal ini terjadi, dan apakah itu akan membuat masalah untuk kode saya .

direktori font pada Elastic Beanstalk yang menjalankan AWS Linux

ls -la tangkapan layar

Dari jawaban lain di AskUbuntu saya menemukan kunci ini tentang bagaimana menafsirkan warna-warna ini. Saya tidak bisa mengerti mengapa .ttf akan dapat dieksekusi atau mengapa satu set .ttf akan dikenali dan bukan yang lain.

Biru: Direktori

Hijau: File data yang dapat dieksekusi atau dikenali

Biru Langit: File tertaut

Kuning dengan latar belakang hitam: Perangkat

Merah muda: File gambar grafik

Merah: File arsip

Semua file ini diunduh ke mac dari berbagai situs font sebelum diunggah.

Pranab
sumber
5
Warna spesifik (biru, merah muda, dll) tidak berarti apa-apa. Anda dapat menyesuaikan warna menjadi apa pun yang Anda inginkan. linux-sxs.org/housekeeping/lscolors.html Untuk memeriksa warna untuk sistem spesifik Anda, gema $ LS_COLORS
beardedlinuxgeek
Untuk memperjelas, maksud saya bukan tentang warna semata, tetapi untuk memahami apakah ini menunjukkan saya akan menghadapi masalah dengan skrip / kode saya.
Pranab

Jawaban:

13

ls -lakan memberi tahu Anda secara pasti apakah suatu file dapat dieksekusi atau tidak. Saya tidak berpikir ada misteri besar di sini. Anda mengunduh file dari berbagai sumber yang masing-masingnya mungkin memiliki bit izin berbeda yang ditetapkan karena satu dan lain alasan. * Jika Anda tidak suka melihat beberapa dengan warna dan lainnya tanpa mencoba chmod -x *.ttf... file font seharusnya tidak memerlukan set bit yang dapat dieksekusi.

* Sebagai komentar Matteo Italia yang sangat tervvotasikan, yang harus dipertahankan, mengatakan: Kemungkinan besar mereka disalin dari FAT atau volume NTFS, yang tidak menyimpan bit yang dapat dieksekusi, jadi di -mount secara default sehingga semua file memiliki bit bit yang dapat dieksekusi .

B Layer
sumber
1
Persis. Satu-satunya perbedaan antara file biasa yang memiliki set izin 'yang dapat dieksekusi', dan yang tidak, adalah ketika Anda mencoba menjalankan file dari baris perintah, untuk file dengan set x bit, OS akan mencoba menggunakan program, jika apapun itu didefinisikan dalam sistem, untuk membuka file itu.
Gnudiff
2
@Ranab tidak, untuk font tidak boleh ada perbedaan.
Gnudiff
1
@ Parab Senang saya bisa membantu. Ketika saya berada di komputer yang tepat dengan keyboard, saya akan mencoba membuat jawaban yang lebih informatif, sehingga ada konteks yang lebih luas.
Gnudiff
1
Sebenarnya, saya lebih suka tidak menyesatkan seseorang yang tidak tahu sebaliknya jadi inilah komentar asli saya dikurangi bit yang salah: Ada berbagai alasan mengapa bit mungkin diatur .. jika di mana saja di sepanjang baris seseorang menyalakan bit yang dapat dieksekusi maka itu dapat "mengikuti" file di sekitar. (Ini mengandaikan bahwa setiap orang yang menyalinnya mempertahankan bit-bit asli itu.) Bagaimanapun juga tidak berbahaya.
B Layer
12
Kemungkinan besar mereka disalin dari volume FAT atau NTFS, yang tidak menyimpan bit yang dapat dieksekusi, jadi dipasang secara default sehingga semua file memiliki bit yang dapat dieksekusi .
Matteo Italia
6

Sepertinya lsperintah yang Anda jalankan adalah alias untukls --color

man ls

--color [= WHEN] mewarnai output; KAPAN bisa 'selalu' (default jika dihilangkan), 'otomatis', atau 'tidak pernah'; info lebih lanjut di bawah ini

Anda dapat memeriksanya dengan menjalankan sumber ls:

  • Menggunakan kutipan:

    "ls" -a

  • Menggunakan path lengkap (mis. Jika lslokasi berada di /bin/ls) dan lihat apakah itu menunjukkan warna atau tidak:

    / bin / ls -a

Catatan: menjalankan ls -laakan menunjukkan kepada Anda rincian file, dan Anda akan dapat melihat detail lengkap dari setiap file, yang akan memungkinkan Anda untuk memeriksa dengan output yang diharapkan darils --color

Yaron
sumber
Sangat menarik berapa banyak cara yang ada untuk sampai ke perintah inti. Saya tidak mengetahui metode surround-with-quotes. Setidaknya dengan bash, seseorang juga dapat mengawali perintah dengan backslash \ls -a,, atau menggunakan perintah 'builtin command ls -a,. Jika Anda ingin melihat bagaimana suatu perintah menyelesaikan, daripada menjalankannya, ada type -a ls.
B Layer
@Airair. metode kutipan dan backslash hanya mencegah ekspansi alias. Mereka tidak akan memiliki efek apa pun jika Anda memiliki fungsi shell atau builtin yang disebut ls.
shadowtalker
@ssdecontrol Benar. Saya tidak bermaksud menyarankan sebaliknya ... kami berbicara tentang alias sehubungan dengan ls. Tapi ini informasi yang bagus.
B Layer
4

Warna menunjukkan bahwa file ditandai sebagai "dapat dieksekusi" *

Bit izin yang dapat dieksekusi (satu untuk pengguna, satu untuk grup, satu untuk yang lain) berarti bahwa jika nama file dilewatkan ke salah satu sistem exec panggilan kernel akan melanjutkan dan mencoba dan membukanya.

Konvensi adalah bahwa hanya file yang benar-benar dimaksudkan untuk dibuka yang memiliki bit yang dapat dieksekusi. Namun ketika memindahkan / menyalin file, terutama di lingkungan multi platform, mudah untuk secara tidak sengaja mendapatkan atau kehilangan bit yang dapat dieksekusi.

File yang disimpan di sistem file yang tidak mendukung izin unix (gendut, ntfs dll) cenderung muncul ke sistem sebagai executable. Memindahkan atau menyalin file-file ini ke sistem file unix menggunakan alat yang mempertahankan izin kemudian akan mempertahankan bit yang dapat dieksekusi tersebut.

Di sisi lain menggunakan alat untuk memindahkan file yang tidak dapat mempertahankan izin atau digunakan dengan opsi untuk mempertahankan izin yang tidak dipilih kemungkinan akan mengakibatkan salinan tidak ditandai sebagai dapat dieksekusi meskipun aslinya.

Jadi setelah dipindahkan di berbagai platform menggunakan berbagai alat bit izin yang dapat dieksekusi dapat berakhir dalam keadaan yang cukup sewenang-wenang.

* Saya tidak 100% yakin bagaimana ls menangani case di mana beberapa tetapi tidak semua bit executable diatur.

plugwash
sumber
2

Seperti jawaban sebelumnya mengatakan, pewarnaan adalah untuk menunjukkan apakah file dianggap dapat dieksekusi atau tidak.

Izin "eksekusi" (= bit) di Linux dan sebagian besar Unix lainnya memiliki satu arti untuk file dan lainnya untuk direktori.

Untuk direktori, jika Anda memiliki izin untuk menjalankannya, Anda dapat melihat isinya. Jika tidak, Anda tidak dapat melakukan cd ke direktori, atau Anda dapat membuat daftar file di dalamnya, bahkan jika Anda memiliki akses baca dan tulis ke direktori.

Untuk file biasa (tidak seperti file perangkat dan jenis file Unix khusus lainnya), bit eksekusi berarti bahwa jika Anda menggunakan nama file pada baris perintah, O / S (atau lebih tepatnya: shell) akan mencoba "mengeksekusi" atau menjalankan file sebagai perintah. Sebaliknya, jika Anda tidak memiliki izin untuk mengeksekusi file, Anda tidak dapat menjalankannya dari baris perintah.

Jadi, jika Anda, misalnya, menghapus izin x dari semua pengguna pada file / bin / cat (yang merupakan perintah Unix) Anda sendiri atau siapa pun dan program apa pun yang mencoba menggunakan perintah "cat" akan gagal.

Itu adalah perintah OS, seperti "cat" dan "grep", yang memiliki file executeble yang biasanya di / * / bin / direktori - / bin, / usr / bin, / sbin, / usr / sbin dll.

Dan kemudian ada skrip yang tidak dikompilasi, ditafsirkan, yang dapat ditulis dalam beberapa bahasa pemrograman, seperti skrip Python atau shell (pada dasarnya, perintah yang Anda tulis seolah-olah dari commandline saat sshing ke server).

Sekarang, ketika Anda menetapkan bit eksekusi pada file skrip (misalnya, file foobar), dan mencoba mengeksekusinya dengan shell Anda: "./foobar", shell mencoba menganalisis file dan menemukan program yang benar untuk meneruskan skrip untuk.

Shell ini melakukannya dengan mencoba membaca baris pertama file dan menemukan notasi "shebang" dari program mana yang seharusnya dijalankan.

Jadi, jika foobar Anda adalah file teks dengan baris pertama seperti ini:

#!/usr/bin/python

Kemudian shell akan mencoba untuk mengeksekusi perintah /usr/bin/python foobar:, pada dasarnya memanggil juru bahasa python dan meneruskan nama file foobar Anda ke file tersebut sebagai skrip Python.

Jika shell tidak menemukan baris pertama dalam file Anda, maka shell akan mencoba mengeksekusi foobar itu sendiri seolah-olah berisi perintah shell.

Jika file dengan bit yang dapat dieksekusi tidak mengandung perintah shell yang valid, shell hanya akan mengeluh.

Jadi inilah yang akan terjadi, jika Anda memiliki file TTF dengan set bit exec dan mencoba menjalankannya dari baris perintah:

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

Jadi, untuk font, mungkin lebih rapi, jika bit exec tidak diset, tetapi tidak benar-benar mengubah apa pun.

PS Hanya beberapa informasi asing. Jika Anda menghapus bit eksekusi pada beberapa perintah atau skrip, itu mungkin masih diteruskan ke program lain sebagai argumen. Jika program lain itu tahu, bagaimana menjalankan perintah Anda, penghapusan exec bit Anda tidak terlalu penting. Misalnya, skrip foobar Python masih akan dijalankan oleh juru bahasa Python, jika Anda melakukannya dari baris perintah:

$python foobar

dari pada

$./foobar

Sama dengan contoh perintah sistem, seperti "cat". Jika Anda menghapus bit exec dari "cat", Anda masih bisa meneruskannya ke instance baru shell untuk dieksekusi:

$sh -c 'cat myfile'

akan bekerja, bahkan jika Anda telah menghapus bit exec dari kucing dan

$cat myfile

tidak.

Gnudiff
sumber
2
Pada sistem saya, setidaknya, unsetting bit executable pada file executable biner seperti catatau echotidak tidak membiarkan Anda menjalankan melalui sh -c 'cat myfile', atau dengan system("cat", "myfile")bahasa seperti Ruby. Alasan Python dapat menjalankan .pyfile yang tidak dapat dieksekusi adalah karena membacanya sebagai string teks, dan kemudian menggunakan penerjemah untuk membuat teks itu berperilaku seolah-olah itu kode.
Ethan Kaminski
@EthanKaminski Menarik. Saya jelas ingat itu bekerja untuk saya, tetapi harus memeriksa detailnya.
Gnudiff
1
@ Gnudiff Untuk file biner yang dapat dieksekusi, execvepanggilan sistem bersikeras untuk menjalankan izin. Pada sistem berbasis glibc, Anda dapat memanggil linker dinamis sebagai program untuk mendapatkan efek yang kira-kira sama dengan baris shebang ( /lib64/ld-linux-x86-64.so.2 /bin/cat) dan ini berfungsi untuk saya bahkan jika file pada baris perintah tidak dapat dieksekusi, tetapi sh -c cattidak akan melakukan itu untukmu.
zwol
Bukan shell yang menentukan apakah dan bagaimana cara mengekseksi file, melainkan kernelnya. Shell hanya memberikan nama dan parameter yang dapat dieksekusi ke kernel.
plugwash