Màu sắc ls: tại sao một số phông chữ của tôi màu đen và những màu khác có màu xanh lục ở đầu ra ls


10

Tôi đã tải lên một số tệp phông chữ lên AWS (chạy Amazon Linux) và chuyển chúng vào /usr/share/fontsthư mục bằng cách sử dụng cplệnh trong .ebextensions.

Khi tôi SSH từ máy Mac của mình và sử dụng ls -a, tôi thấy một số tệp có màu khác nhau - một bộ tệp phông chữ có màu đen trong khi các tệp khác có màu xanh lá cây. Tôi tò mò điều gì đã khiến điều này trở nên như vậy và liệu nó có tạo ra bất kỳ vấn đề nào cho mã của tôi không .

thư mục phông chữ trên Elastic Beanstalk chạy AWS Linux

Ảnh chụp màn hình ls -la

Từ một câu trả lời khác trên AskUbfox tôi đã tìm thấy chìa khóa này về cách diễn giải những màu này. Tôi không thể hiểu tại sao một .ttf sẽ được thực thi hoặc tại sao một bộ .ttfs sẽ được nhận ra mà không phải là một bộ khác.

Màu xanh: Thư mục

Màu xanh lá cây: Tệp dữ liệu có thể thực thi hoặc được công nhận

Sky Blue: Tập tin được liên kết

Màu vàng với nền đen: Thiết bị

Pink: tập tin hình ảnh đồ họa

Màu đỏ: Lưu trữ tập tin

Các tệp này đều được tải xuống mac từ các trang web phông chữ khác nhau trước khi tải lên.


5
Các màu cụ thể (xanh, hồng, v.v.) không có nghĩa gì cả. Bạn có thể tùy chỉnh màu sắc thành bất cứ điều gì bạn muốn. linux-sxs.org/housekeep/lscolors.html Để kiểm tra màu sắc cho hệ thống cụ thể của bạn, hãy lặp lại $ LS_COLORS
beardedlinuxgeek

Để làm rõ, ý định của tôi không thực sự là về màu sắc, nhưng để hiểu nếu điều này cho thấy tôi sẽ phải đối mặt với bất kỳ vấn đề nào với tập lệnh / mã của mình.
Pranab

Câu trả lời:


13

ls -lsẽ cho bạn biết chắc chắn một tập tin có thể thực thi được hay không. Tôi không nghĩ có bất kỳ bí ẩn lớn ở đây. Bạn đã tải xuống các tệp từ nhiều nguồn khác nhau, mỗi nguồn có thể có các bit quyền khác nhau được đặt vì lý do này hay lý do khác. * Nếu bạn không thích nhìn thấy một số màu sắc và những cái khác mà không thử chmod -x *.ttf... các tệp phông chữ thì không cần tập bit thực thi.

* Như nhận xét được đánh giá cao của Matteo Italia, cần được lưu giữ, nói: Hầu hết có thể chúng được sao chép từ ổ đĩa FAT hoặc NTFS, không lưu trữ bit thực thi, do đó được gắn theo mặc định để tất cả các tệp có tập bit thực thi .


1
Chính xác. Sự khác biệt duy nhất giữa một tệp thông thường có tập quyền 'thực thi' và một tệp không, là khi bạn cố chạy tệp từ dòng lệnh, đối với tệp có x bit được đặt, OS sẽ cố gắng sử dụng chương trình, nếu bất kỳ như vậy được xác định trong hệ thống, để mở tập tin đó.
Gnudiff

2
@Pranab không, đối với phông chữ không nên có sự khác biệt.
Gnudiff

1
@Pranab Vui mừng tôi có thể giúp. Khi tôi ở một máy tính phù hợp với bàn phím, tôi sẽ cố gắng đưa ra một câu trả lời nhiều thông tin hơn, để có một bối cảnh rộng hơn có sẵn.
Gnudiff

1
Trên thực tế, tôi không muốn lừa dối ai đó mà không biết cách khác vì vậy đây là nhận xét ban đầu của tôi trừ đi các bit sai: Có nhiều lý do tại sao bit có thể được đặt .. nếu bất cứ nơi nào dọc theo dòng ai đó bật bit thực thi thì điều đó có thể "theo dõi" các tập tin xung quanh. (Điều này giả định rằng mỗi người sao chép nó sẽ bảo tồn các bit gốc đó.) Nó khá vô hại trong mọi trường hợp.
Lớp B

12
Rất có thể chúng được sao chép từ một ổ đĩa FAT hoặc NTFS, không lưu trữ bit thực thi, do đó được gắn theo mặc định để tất cả các tệp có tập bit thực thi .
Matteo Italia

6

Có vẻ như lslệnh bạn đang thực thi là bí danh chols --color

người đàn ông ls

--color [= WHEN] tô màu đầu ra; KHI có thể là 'luôn luôn' (mặc định nếu bị bỏ qua), 'tự động' hoặc 'không bao giờ'; thêm thông tin dưới đây

Bạn có thể kiểm tra nó bằng cách chạy nguồn gốc ls:

  • Sử dụng dấu ngoặc kép:

    "ls" -a

  • Sử dụng đường dẫn đầy đủ (ví dụ: nếu lsvị trí nằm trong /bin/ls) và xem liệu nó có hiển thị màu sắc hay không:

    / bin / ls -a

Lưu ý: đang chạy ls -lasẽ hiển thị cho bạn các chi tiết của các tệp và bạn sẽ có thể xem chi tiết đầy đủ của từng tệp, cho phép bạn kiểm tra với đầu ra dự kiến ​​củals --color


Thật thú vị khi có nhiều cách để có được lệnh cốt lõi. Tôi đã không nhận thức được phương pháp bao quanh với dấu ngoặc kép. Ít nhất là với bash, người ta cũng có thể đặt trước lệnh với dấu gạch chéo ngược \ls -ahoặc sử dụng lệnh 'dựng sẵn' command ls -a. Nếu bạn muốn xem một lệnh giải quyết như thế nào, thay vì chạy nó, thì có type -a ls.
Lớp B

@BlairM. các dấu ngoặc kép và các phương thức dấu gạch chéo ngược chỉ ngăn chặn sự mở rộng bí danh. Chúng sẽ không có hiệu lực nếu bạn có hàm shell hoặc hàm dựng sẵn được gọi ls.
Shadowtalker

@ssdecontrol Phải. Tôi không có ý đề nghị khác ... chúng tôi đã nói về bí danh đối với ls. Nhưng đó là thông tin tốt.
Lớp B

4

Màu sắc cho biết tệp được đánh dấu là "thực thi" *

Các bit quyền thực thi (một cho người dùng, một cho nhóm, một cho người khác) có nghĩa là nếu tên của tệp được truyền cho một trong các hệ thống thực thi, thì kernel sẽ tiếp tục và thử và thực hiện nó.

Quy ước là chỉ các tệp thực sự có ý định được thực hiện mới có tập bit thực thi. Tuy nhiên, khi di chuyển / sao chép các tệp xung quanh, đặc biệt là trong môi trường đa nền tảng, rất dễ vô tình thu được hoặc mất các bit thực thi.

Các tệp được lưu trữ trên một hệ thống tệp không hỗ trợ các quyền unix (fat, ntfs, v.v.) có khả năng xuất hiện cho hệ thống dưới dạng thực thi. Di chuyển hoặc sao chép các tệp này vào hệ thống tệp unix bằng công cụ bảo toàn quyền sau đó sẽ bảo toàn các bit thực thi đó.

Mặt khác, sử dụng các công cụ để di chuyển các tệp không thể bảo vệ quyền hoặc được sử dụng với tùy chọn để giữ quyền không được chọn có khả năng dẫn đến việc bản sao không được đánh dấu là có thể thực thi được mặc dù bản gốc là.

Vì vậy, sau khi được di chuyển xung quanh nhiều nền tảng bằng nhiều công cụ khác nhau, các bit cho phép thực thi có thể kết thúc ở trạng thái khá độc đoán.

* Tôi không chắc chắn 100% cách xử lý trường hợp trong đó một số nhưng không phải tất cả các bit thực thi được đặt.


2

Như các câu trả lời trước đã nói, tô màu là để cho biết các tập tin được coi là thực thi hay không.

Quyền "thực thi" (= bit) trong Linux và hầu hết các Unix khác có một nghĩa cho các tệp và một nghĩa khác cho các thư mục.

Đối với các thư mục, nếu bạn đã thực thi quyền đối với nó, bạn có thể xem nội dung của nó. Nếu bạn không, bạn không thể cd vào thư mục, bạn cũng không thể liệt kê các tệp trong đó, ngay cả khi bạn có cả quyền truy cập đọc và ghi vào thư mục.

Đối với các tệp thông thường (trái ngược với các tệp thiết bị và các loại tệp Unix đặc biệt khác), bit thực thi có nghĩa là nếu bạn sử dụng tên tệp trên dòng lệnh, O / S (hay chính xác hơn là: shell) sẽ cố gắng "thực thi" hoặc chạy các tập tin như là một lệnh. Ngược lại, nếu bạn không có quyền thực thi trên tệp, bạn không thể chạy nó từ dòng lệnh.

Vì vậy, nếu bạn, ví dụ, xóa quyền x khỏi tất cả người dùng trên tệp / bin / cat (là lệnh Unix), chính bạn hoặc bất kỳ ai khác và bất kỳ chương trình nào cố gắng sử dụng lệnh "cat" sẽ thất bại.

Đó là các lệnh OS, chẳng hạn như "cat" và "grep", có các tệp thực thi sử dụng trong / * / bin / thư mục - / bin, / usr / bin, / sbin, / usr / sbin, v.v.

Và sau đó có thể được biên dịch, giải thích các tập lệnh, được viết bằng một số ngôn ngữ lập trình, chẳng hạn như Python hoặc shell script (về cơ bản, các lệnh bạn viết như thể từ dòng lệnh khi sshing đến máy chủ).

Bây giờ, khi bạn đặt bit thực thi trên tệp tập lệnh (ví dụ: tệp foobar) và cố gắng thực thi nó bằng trình bao của bạn: "./foobar", trình bao cố gắng phân tích tệp và tìm chương trình chính xác để truyền tập lệnh đến.

Shell này thực hiện bằng cách đọc dòng đầu tiên của tệp và tìm ký hiệu "shebang" của chương trình này được cho là chạy.

Vì vậy, nếu foobar của bạn là một tệp văn bản với dòng đầu tiên như thế này:

#!/usr/bin/python

Sau đó, shell sẽ cố gắng thực thi lệnh : /usr/bin/python foobar, về cơ bản gọi trình thông dịch python và chuyển tên tệp foobar của bạn cho nó dưới dạng tập lệnh Python.

Nếu shell không tìm thấy dòng đầu tiên như vậy trong tệp của bạn, thì nó sẽ cố gắng thực thi chính foobar như thể nó chứa các lệnh shell.

Nếu tệp có bit thực thi không chứa các lệnh shell hợp lệ, shell sẽ đơn giản phàn nàn.

Vì vậy, đây là những gì sẽ xảy ra, nếu bạn có tệp TTF với tập bit exec và cố chạy nó từ dòng lệnh:

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

Vì vậy, đối với phông chữ, nó có thể gọn gàng hơn, nếu bit exec không được đặt, nhưng không thực sự thay đổi bất cứ điều gì.

PS Chỉ là một số thông tin không liên quan. Nếu bạn loại bỏ bit thực thi trên một số lệnh hoặc tập lệnh, nó vẫn có thể được truyền cho bất kỳ chương trình nào khác làm đối số. Nếu chương trình khác đó biết, làm thế nào để thực thi lệnh của bạn, việc loại bỏ bit exec của bạn không thực sự quan trọng. Ví dụ: tập lệnh Python foobar vẫn sẽ được chạy bởi trình thông dịch Python, nếu bạn chỉ cần thực hiện từ dòng lệnh:

$python foobar

thay vì

$./foobar

Tương tự với ví dụ về các lệnh hệ thống, chẳng hạn như "cat". Nếu bạn loại bỏ bit exec từ "cat", bạn vẫn có thể chuyển nó sang một thể hiện mới của shell để thực thi:

$sh -c 'cat myfile'

sẽ hoạt động, ngay cả khi bạn đã loại bỏ bit exec từ cat và

$cat myfile

không.


2
Trên hệ thống của tôi, ít nhất, unset các bit thực thi trên một tập tin thực thi nhị phân như cathay echokhông không cho phép bạn chạy nó qua sh -c 'cat myfile', cũng không phải với system("cat", "myfile")các ngôn ngữ như Ruby. Lý do Python có thể chạy các .pytệp không thể thực thi được là vì nó đọc chúng dưới dạng một chuỗi văn bản và sau đó sử dụng trình thông dịch để làm cho văn bản đó hoạt động như thể nó là mã.
Ethan Kaminski

@EthanK Vitaminki Thú vị. Tôi nhớ rõ ràng nó làm việc cho tôi, nhưng sẽ phải kiểm tra các chi tiết.
Gnudiff

1
@Gnudiff Đối với các tệp thực thi nhị phân, execvehệ thống gọi yêu cầu cấp phép thực thi. Trên các hệ thống dựa trên glibc, bạn có thể gọi trình liên kết động dưới dạng chương trình để có được hiệu ứng gần giống như dòng shebang ( /lib64/ld-linux-x86-64.so.2 /bin/cat) và điều này hoạt động với tôi ngay cả khi tệp trên dòng lệnh không thể thực thi được, nhưng sh -c catsẽ không làm điều đó cho bạn.
zwol

Đây không phải là trình bao xác định xem và làm thế nào để thực hiện một tệp, đó là kernel. Shell chỉ truyền tên và tham số thực thi cho kernel.
cắm vào
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.