ไม่มีเอาต์พุตสีน้อยกว่าสำหรับคำสั่ง ls


21

ถ้าฉันรันlsฉันจะได้เอาต์พุตสีซึ่งฉันคิดว่ามันค่อนข้างสะดวกในการดูไฟล์ประเภทต่างๆ เมื่อฉันพยายามที่จะไปป์กับlessแม้กระทั่ง-rและตั้ง-Rค่าสถานะสีที่หายไปเสมอ ฉันใช้zshเวอร์ชั่น 5.0.7 ความคิดใด ๆ ขอบคุณ

แก้ไข: ฉันอยู่บน OS X


คุณสามารถยืนยันlsได้ว่าถูกเรียกใช้ด้วย--colorหรือไม่ ลองระงับไปป์ไลน์ ( ^Z) หรือใช้psจากเทอร์มินัลอื่น ผลผลิตอะไรwhich lsบ้าง
zackse

ฉันเคลียร์สิ่งนี้จากคิวปิดเนื่องจาก OP ระบุไว้อย่างชัดเจนว่าพวกเขากำลังใช้อยู่less -rดังนั้นจึงไม่เป็นปัญหาสำหรับlessแต่ด้วยls
terdon

ฉันประหลาดใจที่นี่ยังไม่ซ้ำกัน แต่สิ่งที่ฉันพบมากที่สุดคือคำสั่ง Store ในตัวแปรและนั่นคือที่ผู้ใช้ระดับสูง
สกอตต์

@Scott ฉันไม่แน่ใจว่ามีคำซ้ำกันหรือไม่ แต่มีคำถามบางคำถามที่คำตอบคล้ายกันมาก ( lsผลลัพธ์ขึ้นอยู่กับ stdout) สิ่งที่ฉันจำได้คือunix.stackexchange.com/questions/157285/ซึ่งตัวเองถูกทำเครื่องหมายว่าซ้ำกับunix.stackexchange.com/questions/10421/ …
jimmij

@jimmij แต่คำถามเหล่านั้นไม่ได้กล่าวถึงนั่นls --color=autoหมายถึงใช้สีเฉพาะเมื่อเขียนไปยังเทอร์มินัล (เช่นเมื่อเอาต์พุตมาตรฐานคือเทอร์มินัล) และไม่ใช่เมื่อเป็นไฟล์หรือไพพ์
Scott

คำตอบ:


21

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

GNU lsแสดงเอาต์พุตสีบนเทอร์มินัลเมื่อคุณผ่านตัวเลือก--color(หรือ--color=auto) ในการบังคับให้แสดงผลสีโดยไม่คำนึงถึงประเภทไฟล์ของเอาต์พุตมาตรฐานให้ผ่าน--color=alwaysหรือ--color=yes(คำเหล่านั้นเป็นคำพ้องความหมาย) การประชุมนี้ได้รับการปฏิบัติตามคำสั่งอื่น ๆ เช่น GNU grep, FreeBSD grep git diffเป็นต้น

ls --colors=yes -l | less

ด้วยรุ่น FreeBSD ls(ซึ่งพบได้ใน OSX และมีให้เป็นcolorlsพอร์ตใน OpenBSD และ NetBSD) ให้ส่งตัวเลือก-Gเพื่อแสดงสีเมื่อเอาต์พุตเป็นเทอร์มินัล ตั้งค่าสภาพแวดล้อมCLICOLOR_FORCEเพื่อแสดงสีโดยไม่คำนึงถึงประเภทไฟล์ที่ส่งออก

CLICOLOR_FORCE=1 ls -l | less

20

ปัญหาที่เป็นไปได้มากที่สุดคือlsโปรแกรมของคุณได้ตั้งค่าตัวเลือก--color=autoซึ่งโดยทั่วไปหมายความว่าเอาต์พุตควรมีสีถ้าเชื่อมต่อกับเทอร์มินัลมิฉะนั้น (เอาต์พุตที่เชื่อมต่อกับไพพ์หรือไฟล์) ไม่มีสีใดถูกปล่อยออกมา

หากคุณต้องการมีสีเป็นกรณีเช่นนี้คุณควรตั้งค่า--colorตัวเลือกเป็นalwaysดังนั้นลอง

ls --color=always | less -R

หากพฤติกรรมนี้เป็นสิ่งที่คุณคาดหวังตลอดเวลาเพียงสร้างนามแฝง:

alias ls='ls --color=always'

ในการตั้งค่าของฉันเวอร์ชั่นทุบตี 4.3 --color เป็นตัวเลือกที่ผิดกฎหมายการโลภสำหรับ "color" จะบอกฉันเกี่ยวกับตัวเลือก "-G" แต่ไม่ได้พูดอะไรเกี่ยวกับตัวเลือกอัตโนมัติหรือตัวเลือกเสมอ ความคิดใด ๆ
nunos

5
@nunos lsไม่ได้มาจากbashมันเป็นโปรแกรมแบบสแตนด์อโลน เรียกใช้ls --versionเพื่อตรวจสอบรุ่น เหมือง LS GNU coreutils) 8.21
jimmij

@jimiij lsรุ่นของฉันไม่มี--versionธง ฉันใช้ค่าเริ่มต้นจาก OS X ไม่แน่ใจว่าสิ่งนั้นจะช่วยได้หรือไม่
nunos

@nunos โปรดเสมอพูดถึงระบบปฏิบัติการของคุณ มีความแตกต่างอย่างมากระหว่าง Linux และ non-GNU nixes เช่น OSX
terdon

0

ฉันไม่สามารถออกความเห็น @jimmij คำตอบเพราะฉันมีน้อยกว่า 50 ตัวแทน แต่ฉันอยากจะอธิบายสิ่งที่ได้ผลสำหรับฉันใน Bash

ถ้าคุณวิ่ง

$ man ls | grep color

คุณจะเห็นรายการทั้งหมดของmanหน้าสำหรับสภาพแวดล้อมเปลือกเฉพาะของคุณ (ในกรณีของเราbash)

สำหรับฉันแล้วการปรับต่อไปนี้เป็นการหลอกลวง:

$ alias ls='ls -G'

3
ที่ทำงานเพื่ออะไร การ-Gตั้งค่าสถานะไม่เกี่ยวข้องกับวิธีlsจัดการเอาต์พุตสี ls -lที่เพิ่งเอากลุ่มจากการส่งออกของ มันมีผลต่อการแสดงผลสีใน BSD ls (อันที่ใช้กับ OSX ด้วย) นั่นคือสิ่งที่คุณหมายถึง? ไม่ว่าในกรณีใดฉันไม่คิดว่าจะแสดงสีเมื่อเปลี่ยนเส้นทางไปยังไฟล์ แต่จะแสดงสีบนบรรทัดคำสั่ง
terdon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.