สี ls: ทำไมบางส่วนของแบบอักษรของฉันเป็นสีดำและสีเขียวอื่น ๆ ในการแสดงผล ls


10

ฉันอัพโหลดไฟล์ฟอนต์บางไฟล์ไปยัง AWS (รัน Amazon Linux) และย้ายไปยัง/usr/share/fontsไดเรกทอรีโดยใช้cpคำสั่งใน. ส่วนขยาย

เมื่อฉันใช้ SSH จากแม็คและการใช้งานของls -aฉันฉันเห็นไฟล์บางไฟล์มีสีต่างกัน - ไฟล์ฟอนต์ชุดหนึ่งเป็นสีดำในขณะที่ไฟล์อื่น ๆ เป็นสีเขียว ฉันอยากรู้สิ่งที่เกิดขึ้นนี้จะเป็นเช่นนั้นและถ้ามันจะสร้างปัญหาใด ๆ สำหรับรหัสของฉัน

ไดเรกทอรีแบบอักษรบน Elastic Beanstalk ที่ใช้ AWS Linux

ภาพหน้าจอของ ls -la

จากคำตอบอื่นใน AskUbuntuฉันพบกุญแจนี้ในการตีความสีเหล่านี้ ฉันไม่สามารถเข้าใจได้ว่าเหตุใด. ttf จึงสามารถเรียกใช้งานได้หรือทำไมชุด. ttfs หนึ่งชุดจึงสามารถรับรู้ได้และไม่ใช่อีกชุดหนึ่ง

สีน้ำเงิน: สารบบ

เขียว: ไฟล์ข้อมูลที่เรียกทำงานหรือรู้จัก

Sky Blue: ไฟล์ที่เชื่อมโยง

สีเหลืองกับพื้นหลังสีดำ: อุปกรณ์

ชมพู: ไฟล์ภาพกราฟิก

แดง: ไฟล์เก็บถาวร

ไฟล์เหล่านี้ทั้งหมดถูกดาวน์โหลดไปยัง mac จากเว็บไซต์แบบอักษรต่างๆก่อนที่จะอัปโหลด


5
สีเฉพาะ (สีน้ำเงิน, ชมพู, ฯลฯ ) ไม่ได้มีความหมายอะไรเลย คุณสามารถปรับแต่งสีให้เป็นสิ่งที่คุณต้องการ linux-sxs.org/housekeeping/lscolors.htmlหากต้องการตรวจสอบสีสำหรับระบบของคุณ echo $ LS_COLORS
beardedlinuxgeek

เพื่อชี้แจงความตั้งใจของฉันไม่ได้เกี่ยวกับสีต่อ se แต่เพื่อเข้าใจว่าสิ่งนี้บ่งชี้ว่าฉันจะประสบปัญหากับสคริปต์ / รหัสของฉัน
Pranab

คำตอบ:


13

ls -lจะบอกให้คุณทราบอย่างชัดเจนว่าไฟล์นั้นสามารถเรียกใช้งานได้หรือไม่ ฉันไม่คิดว่าจะมีความลึกลับที่ยิ่งใหญ่ที่นี่ คุณดาวน์โหลดไฟล์จากแหล่งต่าง ๆ ซึ่งแต่ละชุดอาจมีบิตสิทธิ์แตกต่างกันตั้งค่าด้วยเหตุผลใดเหตุผลหนึ่ง *หากคุณไม่ต้องการเห็นบางอย่างที่มีสีและอื่น ๆ โดยไม่ลองchmod -x *.ttf... ไฟล์ฟอนต์ไม่ควรต้องมีชุดบิตที่สามารถเรียกใช้งานได้

* เนื่องจากความคิดเห็น upvoted สูงของ Matteo Italia ซึ่งควรได้รับการเก็บรักษาไว้พูดว่า: ส่วนใหญ่พวกเขาอาจถูกคัดลอกมาจากโวลุ่ม FAT หรือ NTFS ซึ่งไม่ได้จัดเก็บบิตที่สามารถเรียกใช้งานได้ดังนั้นจึงติดตั้งตามค่าเริ่มต้น .


1
เผง ความแตกต่างเพียงอย่างเดียวระหว่างไฟล์ปกติที่มีการตั้งค่าการอนุญาต 'ที่สามารถใช้งานได้' และสิ่งที่ไม่ได้เป็นคือเมื่อคุณพยายามเรียกใช้ไฟล์จากบรรทัดคำสั่งสำหรับไฟล์ที่มีชุด x บิต OS จะพยายามใช้โปรแกรมถ้า สิ่งเหล่านี้ถูกกำหนดในระบบเพื่อเปิดไฟล์นั้น
Gnudiff

2
@Pranab ไม่สำหรับแบบอักษรไม่ควรมีความแตกต่าง
Gnudiff

1
@Pranab ดีใจที่ฉันสามารถช่วย เมื่อฉันอยู่ที่คอมพิวเตอร์ที่มีแป้นพิมพ์ฉันจะพยายามหาคำตอบที่ให้ข้อมูลเพิ่มขึ้นเล็กน้อยเพื่อให้มีบริบทที่กว้างขึ้น
Gnudiff

1
ที่จริงแล้วฉันค่อนข้างจะไม่ทำให้คนที่เข้าใจผิดเป็นอย่างอื่นดังนั้นนี่คือความคิดเห็นดั้งเดิมของฉันลบบิตผิด: มีหลายเหตุผลว่าทำไมบิตอาจถูกตั้งไว้ .. สามารถ "ติดตาม" ไฟล์ได้ (สิ่งนี้อนุมานว่าแต่ละคนที่ทำสำเนามันรักษาบิตดั้งเดิมเหล่านั้นไว้) มันค่อนข้างอันตรายมากในทุกกรณี
B Layer

12
ส่วนใหญ่พวกเขาอาจถูกคัดลอกมาจากปริมาณ FAT หรือ NTFS ซึ่งไม่ได้จัดเก็บบิตที่ปฏิบัติการได้ดังนั้นจะถูกติดตั้งโดยค่าเริ่มต้นเพื่อให้ไฟล์ทั้งหมดมีชุดบิตที่ปฏิบัติการได้
Matteo Italia

6

ดูเหมือนว่าlsคำสั่งที่คุณกำลังเรียกใช้จะเป็นชื่อแทนls --color

ผู้ชาย

--color [= เมื่อ] colorize ผลลัพธ์; เมื่อสามารถ 'เสมอ' (ค่าเริ่มต้นหากละเว้น), 'อัตโนมัติ' หรือ 'ไม่'; ข้อมูลเพิ่มเติมด้านล่าง

คุณสามารถตรวจสอบได้โดยเรียกใช้ที่มาls:

  • ใช้คำพูด:

    "ls" -a

  • ใช้เส้นทางแบบเต็ม (เช่นถ้ามีlsตำแหน่งอยู่/bin/ls) และดูว่ามันแสดงสีหรือไม่:

    / bin / ls -a

หมายเหตุ: การทำงานls -laจะแสดงรายละเอียดของไฟล์ต่างๆและคุณจะสามารถดูรายละเอียดทั้งหมดของไฟล์แต่ละไฟล์ซึ่งจะช่วยให้คุณตรวจสอบกับผลลัพธ์ที่คาดหวังของls --color


เป็นเรื่องที่น่าสนใจที่จะได้รับคำสั่งแกนกลาง ฉันไม่ทราบวิธีล้อมรอบด้วยคำพูด อย่างน้อยกับทุบตีหนึ่งยังสามารถนำคำสั่งด้วยเครื่องหมายทับขวา\ls -aหรือใช้คำสั่ง command ls -a'ในตัว, type -a lsหากคุณต้องการที่จะเห็นวิธีการที่แก้ไขคำสั่งแทนที่จะใช้มันมี
B Layer

@BlairM คำพูดและวิธีการแบ็กสแลชป้องกันการขยายนามแฝงเท่านั้น พวกเขาจะไม่ได้มีผลกระทบใด ๆ lsถ้าคุณมีฟังก์ชั่นเปลือกหรือในตัวเรียกว่า
shadowtalker

@ssdecontrol ถูกต้อง ฉันไม่ได้ตั้งใจที่จะขอแนะนำเป็นอย่างอื่น ... lsเรากำลังพูดถึงชื่อแทนด้วยความเคารพ แต่มันเป็นข้อมูลที่ดี
B Layer

4

สีกำลังระบุว่าไฟล์ถูกทำเครื่องหมายว่า "executable" *

บิตสิทธิอนุญาตที่สามารถเรียกใช้งานได้ (หนึ่งสำหรับผู้ใช้หนึ่งสำหรับกลุ่มหนึ่งสำหรับอีกกลุ่มหนึ่ง) หมายความว่าหากชื่อของไฟล์ถูกส่งผ่านไปยังหนึ่งในระบบการเรียกการเรียกเคอร์เนลจะไปข้างหน้าและลองและ exectute

Convention คือไฟล์ที่ตั้งใจจะทำการ exectuted เท่านั้นที่มีชุดของ executable bit อย่างไรก็ตามเมื่อย้าย / คัดลอกไฟล์โดยเฉพาะอย่างยิ่งในสภาพแวดล้อมแบบหลายแพลตฟอร์มมันง่ายที่จะรับหรือสูญหายบิตปฏิบัติการโดยไม่ตั้งใจ

ไฟล์ที่เก็บไว้ในระบบไฟล์ที่ไม่รองรับการอนุญาต unix (fat, ntfs และอื่น ๆ ) มีแนวโน้มที่จะปรากฏต่อระบบปฏิบัติการ การย้ายหรือคัดลอกไฟล์เหล่านี้ไปยังระบบไฟล์ยูนิกซ์โดยใช้เครื่องมือที่สงวนสิทธิ์จะรักษาบิตปฏิบัติการเหล่านั้นไว้

ในทางกลับกันการใช้เครื่องมือเพื่อย้ายไฟล์ที่ไม่สามารถสงวนสิทธิ์หรือใช้กับตัวเลือกในการสงวนสิทธิ์ที่เลือกไว้มีแนวโน้มที่จะส่งผลให้คัดลอกไม่ได้ถูกทำเครื่องหมายเป็นปฏิบัติการแม้จะเป็นต้นฉบับ

ดังนั้นหลังจากที่ถูกย้ายไปรอบ ๆ แพลตฟอร์มที่หลากหลายโดยใช้เครื่องมือที่หลากหลายบิตการอนุญาตที่สามารถใช้งานได้จะสิ้นสุดในสถานะที่ค่อนข้างยุติธรรม

* ฉันไม่แน่ใจ 100% ว่า ls จัดการกับกรณีที่บิตที่เรียกใช้บางส่วนได้หรือไม่


2

ดังคำตอบก่อนหน้านี้ที่กล่าวว่าการระบายสีคือการระบุว่าไฟล์นั้นพิจารณาว่าสามารถเรียกใช้งานได้หรือไม่

สิทธิ์ "execute" (= bit) ใน Linux และ Unixes อื่น ๆ ส่วนใหญ่มีความหมายหนึ่งสำหรับไฟล์และอีกหนึ่งสำหรับไดเรกทอรี

สำหรับไดเรกทอรีหากคุณได้รับอนุญาตให้ดำเนินการคุณสามารถดูเนื้อหาได้ หากคุณไม่ทำเช่นนั้นคุณจะไม่สามารถซีดีไปยังไดเรกทอรีและคุณไม่สามารถแสดงรายการไฟล์ในนั้นแม้ว่าคุณจะมีทั้งการเข้าถึงแบบอ่านและเขียนในไดเรกทอรี

สำหรับไฟล์ปกติ (ตรงข้ามกับไฟล์อุปกรณ์และชนิดไฟล์ Unix พิเศษอื่น ๆ ) บิตเรียกใช้หมายความว่าถ้าคุณใช้ชื่อไฟล์ในบรรทัดคำสั่ง O / S (หรือมากกว่านั้น: shell) จะพยายาม "execute" หรือเรียกใช้ ไฟล์เป็นคำสั่ง ในทางกลับกันหากคุณไม่ได้รับอนุญาตให้ใช้งานไฟล์คุณจะไม่สามารถเรียกใช้จากบรรทัดคำสั่งได้

ตัวอย่างเช่นหากคุณลบสิทธิ์ x จากผู้ใช้ทั้งหมดในไฟล์ / bin / cat (ซึ่งเป็นคำสั่ง Unix) คุณเองหรือใครก็ตามและโปรแกรมใด ๆ ที่พยายามใช้คำสั่ง "cat" จะล้มเหลว

สิ่งเหล่านี้คือคำสั่ง OS เช่น "cat" และ "grep" ซึ่งมีไฟล์ executeble ที่ใช้งานได้จริงใน / * / bin / ไดเรกทอรี - / bin, / usr / bin, / sbin, / usr / sbin เป็นต้น

และจากนั้นอาจมีสคริปต์ที่ไม่ถูกแปลแปลซึ่งเขียนด้วยภาษาโปรแกรมบางอย่างเช่น Python หรือเชลล์สคริปต์ (โดยทั่วไปคือคำสั่งที่คุณเขียนเหมือนจาก commandline เมื่อ sshing ไปยังเซิร์ฟเวอร์)

ตอนนี้เมื่อคุณตั้งค่ารันบิตบนไฟล์สคริปต์ (ตัวอย่างเช่นไฟล์ foobar) และลองเรียกใช้งานโดยเชลล์ของคุณ: "./foobar" เชลล์จะพยายามวิเคราะห์ไฟล์และค้นหาโปรแกรมที่ถูกต้องเพื่อส่งสคริปต์ ถึง.

เชลล์นี้ทำโดยพยายามอ่านบรรทัดแรกของไฟล์และค้นหาเครื่องหมาย"shebang"ของโปรแกรมที่ควรรัน

ดังนั้นหาก foobar ของคุณเป็นไฟล์ข้อความที่มีบรรทัดแรกเช่นนี้:

#!/usr/bin/python

จากนั้นเชลล์จะพยายามดำเนินการคำสั่ง: /usr/bin/python foobarโดยทั่วไปจะเรียกใช้ตัวแปลภาษาไพ ธ อนและส่งชื่อไฟล์ foobar ของคุณไปเป็นสคริปต์ Python

หากเชลล์ไม่พบบรรทัดแรกในไฟล์ของคุณมันก็จะพยายามรัน foobar เองราวกับว่ามันมีคำสั่งเชลล์

หากไฟล์ที่มีบิตเรียกทำงานไม่ได้มีคำสั่งเชลล์ที่ถูกต้อง แต่เชลล์ก็จะบ่น

ดังนั้นนี่คือสิ่งที่จะเกิดขึ้นหากคุณมีไฟล์ TTF ที่มีชุดบิต exec และพยายามเรียกใช้จากบรรทัดคำสั่ง:

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

ดังนั้นสำหรับฟอนต์ก็น่าจะเป็น neater ถ้าไม่ได้ตั้งค่าบิตบิต แต่ไม่ได้เปลี่ยนแปลงอะไรเลย

ป.ล. เพียงแค่มีข้อมูลที่ไม่เกี่ยวข้อง หากคุณลบบิตเรียกใช้งานบนคำสั่งหรือสคริปต์บางรายการอาจยังคงถูกส่งผ่านไปยังโปรแกรมอื่น ๆ เพื่อเป็นอาร์กิวเมนต์ หากโปรแกรมอื่นรู้วิธีดำเนินการคำสั่งของคุณการลบ exec บิตของคุณไม่สำคัญ ตัวอย่างเช่นสคริปต์ foobar Python จะยังคงทำงานโดย Python interpreter ถ้าคุณทำจาก command line:

$python foobar

แทน

$./foobar

เช่นเดียวกับตัวอย่างของคำสั่งระบบเช่น "cat" หากคุณลบ exec บิตออกจาก "cat" คุณยังคงสามารถส่งผ่านไปยังอินสแตนซ์ใหม่ของเชลล์สำหรับการดำเนินการ:

$sh -c 'cat myfile'

จะทำงานแม้ว่าคุณจะลบ exec บิตจาก cat และ

$cat myfile

ไม่


2
ในระบบของฉันอย่างน้อย unsetting บิตปฏิบัติการในไฟล์ไบนารีเหมือนcatหรือechoไม่ไม่ได้ช่วยให้คุณสามารถเรียกใช้มันผ่านsh -c 'cat myfile'หรือด้วยsystem("cat", "myfile")ในภาษาเช่น Ruby เหตุผลที่ Python สามารถเรียกใช้.pyไฟล์ที่ไม่สามารถทำงานได้นั้นเป็นเพราะมันอ่านไฟล์เหล่านั้นในรูปของสตริงข้อความจากนั้นใช้ล่ามเพื่อทำให้ข้อความนั้นทำงานเหมือนกับว่ามันเป็นรหัส
Ethan Kaminski

@EthanKaminski น่าสนใจ ฉันจำได้ชัดเจนว่ามันใช้งานได้สำหรับฉัน แต่จะต้องตรวจสอบรายละเอียด
Gnudiff

1
@Gnudiff สำหรับไบนารีที่ปฏิบัติการได้execveระบบจะยืนยันการอนุญาตให้เรียกใช้ สำหรับระบบที่ใช้ glibc คุณสามารถเรียกใช้ dynamic linker เป็นโปรแกรมเพื่อให้ได้ผลคล้ายกับ shebang line ( /lib64/ld-linux-x86-64.so.2 /bin/cat) และมันใช้งานได้สำหรับฉันแม้ว่าไฟล์ในบรรทัดคำสั่งจะไม่สามารถใช้งานได้ แต่sh -c catจะไม่ทำเช่นนั้น สำหรับคุณ.
zwol

ไม่ใช่เชลล์ที่กำหนดว่าจะใช้ไฟล์เป็นอย่างไรและเป็นเคอร์เนลหรือไม่ เชลล์ส่งชื่อและพารามิเตอร์ที่สามารถเรียกทำงานได้ไปยังเคอร์เนล
plugwash
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.