อนุรักษ์สีในขณะที่ไปป์ไลน์


62
ls -l --color=auto | tee output.log

ไม่มีท่อ / ทีมันมีสี ฉันจะทำให้มันเป็นสีได้อย่างไรในขณะที่ใช้งานtee(สามารถระบายสีบนหน้าจอได้เท่านั้นฉันไม่สนใจสีในบันทึก)


คำตอบ:


84

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

ตัวอย่างเช่น

unbuffer ls -l --color=auto | tee output.log

หากคุณยังไม่ได้ติดตั้งไว้บน Ubuntu และดิสทริบิวชัน Debian-ish Linux อื่น ๆ ที่คุณสามารถติดตั้งunbufferได้

sudo apt-get install expect-dev

6
โซลูชันอื่นซึ่งไม่ต้องติดตั้งอะไรอยู่ที่stackoverflow.com/questions/3515208/…
Tgr

3
สิ่งนี้ทำให้ไฟล์ผลลัพธ์มีรหัสสี (แน่นอน); มีวิธีใดบ้างที่จะพิมพ์ไฟล์ในแบบที่ใช้รหัสสีและแสดงสีในเทอร์มินัลอย่างเหมาะสม?
Kyle Strand

2
อืมนั่นทำให้รายการรหัสผ่านแสดงรหัสผ่านของคุณใน cleartext!
AndiDog

@Tgr วิธีแก้ปัญหานั้นใช้ไม่ได้กับฉันใน OS X ที่พยายามรับเอาท์พุทสีดิบxcodebuild- แทนที่จะเป็นเส้นที่ไม่มีสี unbuffer xcodebuild | less -Rทำงานได้อย่างไม่มีที่ติ
Slipp D. Thompson

2
คุณไม่ต้องการexpect-devแพ็คเกจ expectก็เพียงพอแล้ว
Yajo

11

ใช้ตัวเลือก ls --color=always

--color=auto จะไม่ส่งสีไปป์ไลน์ด้วยเหตุผลที่ชัดเจน

หน้าหลักบอกว่าต่อไปนี้:

ด้วย --color = auto รหัสสีจะแสดงผลก็ต่อเมื่อเอาต์พุตมาตรฐานเชื่อมต่อกับเทอร์มินัล (tty)


2
ตกลง. นั่นอธิบายได้ แต่ฉันยังสามารถเห็นสีบนหน้าจอได้หรือไม่? (มันคือ TTY หลังจากทั้งหมด) ฉันไม่รังเกียจที่จะไม่มีพวกเขาใน logfile แต่ฉันต้องการมันอย่างแน่นอนบนหน้าจอของฉัน
PawełGościcki

ฉันคิดว่าฉันทำให้ตัวเองไม่ชัดเจนพอ ls -lเป็นเพียงตัวอย่าง ผมมีคำสั่งที่แตกต่างอย่างสิ้นเชิง (Heroku บันทึก) teeที่แถบสีเมื่อประปา และฉันต้องการที่จะ "แก้ไข / เปลี่ยนแปลง" ที / ท่อไม่ใช่คำสั่งที่ฉันกำลังดำเนินการ
PawełGościcki

1
@ Pawel คุณไม่สามารถแก้ไขได้อย่างง่ายดายใน tee / pipe เนื่องจาก tee / pipe ไม่ได้ลอกรหัสสีเหล่านี้ ปัญหาคือว่าคำสั่งเริ่มต้นเห็นว่ามันไม่ได้เขียนไปยังสถานี คุณต้องใช้เทอร์มินัลหลอกที่ทำหน้าที่เหมือนไพพ์ แต่คำสั่งที่เห็นเป็นเทอร์มินัล
RedGrittyBrick

หืม ... ยุติธรรมพอ ฉันเดาว่าฉันต้องยอมรับว่ามันเป็นอย่างไร
PawełGościcki

3
@ PawełGościckiคำตอบนี้จะแก้ไขปัญหาสำหรับlsเท่านั้น ดูคำตอบของฉันที่แก้ไขปัญหาสำหรับทุกโปรแกรมรวมถึงบันทึก heroku
Eamonn O'Brien-Strain

3

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

พิมพ์ lsเอาต์พุตไปยัง stdout และไฟล์ด้วยรหัสสี :

script -efq output.log -c "ls -l --color=auto"

โดยที่ ( man script):

  -e, --return
         Return the exit code of the child process.  Uses the same
         format as bash termination on signal termination exit code is 128+n.
  -f, --flush
         Flush output after each write.  This is nice for telecooperation:
        one person does `mkfifo foo; script -f foo', and another can 
        supervise real-time what is being done using `cat foo'.
  -q, --quiet
         Be quiet (do not write start and done messages to either 
         standard output or the typescript file).

ดูไฟล์เอาต์พุตด้วยสี:

less -r output.log

2
-eเหมือนกับ--return- ไม่จำเป็นสำหรับทั้งคู่ เป็น-efq --return --flush --quiet
Noel Maersk

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