เอาท์พุทสีที่ไม่สอดคล้องกันจากคำสั่ง `ls '


28

ฉันสอนหลักสูตร Intro to UNIX / Linux ที่วิทยาลัยท้องถิ่นและนักเรียนคนหนึ่งของฉันถามคำถามต่อไปนี้:

เหตุใดไฟล์บางไฟล์ในไดเรกทอรีของฉันจึงมีสีขาวและไฟล์อื่น ๆ เป็นสีเทา ไฟล์สีขาวเป็นไฟล์ที่ฉันสร้างวันนี้และไฟล์สีเทาเป็นไฟล์ที่มีอยู่หรือไม่

เมื่อฉันมองเข้าไปในนี้ฉันคิดว่าคำตอบแรกจะอยู่ในLS_COLORSตัวแปร แต่การตรวจสอบเพิ่มเติมพบว่ารายการสีแตกต่างกันเมื่อใช้-lสวิตช์กับ-alสวิตช์ด้วยlsคำสั่ง ดูภาพหน้าจอต่อไปนี้:

ใช้ ls -l ไฟล์ชื่อ '3' จะแสดงเป็นสีขาว

การใช้สวิตช์ -al ไฟล์เดียวกันจะแสดงเป็นสีเทา

การใช้ls -lไฟล์ชื่อ '3' จะแสดงเป็นสีขาว แต่ใช้-alสวิตช์ไฟล์เดียวกันจะแสดงเป็นสีเทา

นี่เป็นข้อบกพร่องใน ls หรือไม่มีใครรู้ว่าทำไมสิ่งนี้ถึงเกิดขึ้น?


เขียนชื่อคำถามของคุณ: การระบายสีนั้นไม่มีส่วนเกี่ยวข้องกับlsคำสั่ง
ดึง

FWIW สิ่งที่ใกล้เคียงที่สุดที่คุณสามารถทำได้โดยการล้อเล่นกับ LS_COLORS คือLS_COLORS='rs=0;1' ls -lแต่มันดูแตกต่างกันมาก
wjandrea

4
@ ดึงคุณจะรู้ว่าหลังจากตรวจสอบปัญหา เห็นได้ชัดว่าlsสามารถเปลี่ยนสีของผลลัพธ์
ท่อ

@pipe: ไม่ฉันรู้ว่านานก่อนที่จะมีสี มันไม่จำเป็นต้องให้สีแม้ว่ารุ่นล่าสุดls จะสามารถให้สีได้ ;-)
ดึง

คำตอบ:


68

ดูเหมือนว่าถ้าพรอมต์สตริงของคุณ ( $PS1) คือการตั้งค่าแอตทริบิวต์ตัวหนาตัวละครที่จะทำให้สีที่ดีกว่าและไม่unsettingมัน ผลลัพธ์จากlsไม่รู้เกี่ยวกับสิ่งนี้และไม่ได้ตั้งตัวหนา ดังนั้นหลังจากผลลัพธ์สีแรกของlsทุกอย่างดูหรี่


1
ใช่นั่นคือมัน การเปลี่ยนสีครั้งสุดท้ายใน $ PS1 ตั้งค่าตัวหนา + สีขาว (1; 37) - ขอบคุณ!
Bill R

3
คุณสามารถทำเครื่องหมายว่ายอมรับแล้ว
Thomas Dickey

0

เอาต์พุตทั้งหมดของ ls จะถูกพิมพ์ในสีที่ใช้งานล่าสุด หากlsถูกเรียกโดยไม่มีสี:

$ printf '\e[0;31m color test\n'; /bin/ls
 color test
filea  fileb  filec  filed  filee  filef  fileg  fileh

จะพิมพ์รายชื่อของไฟล์ในสีแดง

หรือหากไม่ต้องการเปลี่ยนสีสำหรับ ls สีสุดท้ายจะยังคงอยู่:

$ mkdir t1; cd t1; touch file{a..h}
$ printf '\e[0;31m color test\n'; /bin/ls --color -l
 color test
total 0
-rw-r--r-- 1 user user 0 Feb 23 01:16 filea
-rw-r--r-- 1 user user 0 Feb 23 01:16 fileb
-rw-r--r-- 1 user user 0 Feb 23 01:16 filec
-rw-r--r-- 1 user user 0 Feb 23 01:16 filed
-rw-r--r-- 1 user user 0 Feb 23 01:16 filee
-rw-r--r-- 1 user user 0 Feb 23 01:16 filef
-rw-r--r-- 1 user user 0 Feb 23 01:16 fileg
-rw-r--r-- 1 user user 0 Feb 23 01:16 fileh

ยังคงเป็นสีแดงทั้งหมด

แต่ทันทีที่lsจำเป็นต้องตั้งค่าสี (จากนั้นรีเซ็ตสีเป็นค่าเริ่มต้นที่ใช้โดยคอนโซล) สีที่ใช้ตั้งแต่นั้นมาจะเป็นค่าเริ่มต้นของคอนโซล

$ printf '\e[0;31m color test\n'; /bin/ls --color -la
 color test
total 8
drwxr-xr-x 2 user user 4096 Feb 23 01:16 .
drwxr-x--- 7 user user 4096 Feb 23 01:15 ..
-rw-r--r-- 1 user user    0 Feb 23 01:16 filea
-rw-r--r-- 1 user user    0 Feb 23 01:16 fileb
-rw-r--r-- 1 user user    0 Feb 23 01:16 filec
-rw-r--r-- 1 user user    0 Feb 23 01:16 filed
-rw-r--r-- 1 user user    0 Feb 23 01:16 filee
-rw-r--r-- 1 user user    0 Feb 23 01:16 filef
-rw-r--r-- 1 user user    0 Feb 23 01:16 fileg
-rw-r--r-- 1 user user    0 Feb 23 01:16 fileh

ด้วยสามบรรทัดแรก (สูงสุดถึงจุดสีฟ้า) พิมพ์ด้วยสีแดง

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