รหัสยกเว้น ANSI ของฉันจะไปที่ใดเมื่อฉันไปที่กระบวนการอื่น ฉันสามารถเก็บไว้ได้ไหม


36

บางครั้งฉันต้องการที่จะส่งสัญญาณออกมาเป็นสีเช่นกระบวนการ grep ... แต่เมื่อฉันส่งไปยังกระบวนการอื่นเช่น sed, รหัสสีจะหายไป ...

มีวิธีในการรักษารหัสเหล่านี้เหมือนเดิมหรือไม่?

นี่คือตัวอย่างที่สูญเสียผลลัพธ์สี:

echo barney | grep barney | sed -n 1,$\ p   

4
PS .. เป็นข้อมูลทั่วไป .. ฉันเพิ่งค้นพบว่าlessสามารถรับการป้อนข้อความ colorized (ดี :) ... เช่น: tree -C ~/ |less -Rหรือls -lR --color=always . |less -R
Peter.O

คำตอบ:


40

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

วิธีที่ง่ายที่สุดในการจับเอาท์พุทสีจากโปรแกรมเช่นนั้นคือบอกให้เขียนสีแม้ว่ามันจะไม่ได้เชื่อมต่อกับ TTY คุณจะต้องอ่านเอกสารของโปรแกรมเพื่อดูว่ามีตัวเลือกนั้นหรือไม่ (เช่นgrepมี--color=alwaysตัวเลือก)

คุณสามารถใช้expectสคริปต์unbufferเพื่อสร้างหลอกแบบนี้:

echo barney | unbuffer grep barney | sed -n 1,$\ p

2
ขอบคุณสำหรับข้อมูลเกี่ยวกับการตรวจจับ TTY และการปลอมแปลงออก!
shellter

@cjm .. มันไม่ทำงานที่นี่ (บน Ubuntu 10.04 / bash 4.1.5) ... แต่ 10.04 repo ของฉันมีเพียงรุ่น -dev และไม่มีอะไรใน backport ... มันช้าไปหน่อยดังนั้นฉันจะดู พรุ่งนี้อีกครั้ง ... แต่อย่างที่คุณพูดโปรแกรม colorizing เหล่านี้อาจสลับไปตามปลายทางผลลัพธ์ (mhhh แต่พวกเขารู้ได้อย่างไรว่ามันเป็น goiong ต่อ tty .. ไม่สำคัญ .. ) และพวกเขาก็อาจมีตัวเลือกที่จะบังคับ มัน .. ขอบคุณ ,,,
Peter.O

@ เฟรดพวกเขามักใช้isattyเพื่อค้นหาว่าstdoutจะไปที่ไหน ฉันไม่แน่ใจว่าunbufferทำงานได้จริงหรือไม่เมื่อคุณกำลังเข้าสู่โปรแกรมหรือไม่ ฉันไม่ได้ติดตั้งไว้ที่นี่เพื่อลอง
cjm

ขอบคุณสำหรับunbufferข้อมูลมันช่วยให้เอาต์พุตของ IRC bot ของฉันเหมือนกับเอาต์พุตในเชลล์
LiuYan 刘研

4

มันเหมาะกับฉัน -! (ในสภาพแวดล้อม MingW ปัจจุบัน)

echo barney | grep --color=always barney | sed -n '1,$p'
**barney**

# barney แสดงเป็นข้อความสีแดง

$ grep --version
GNU grep 2.5.4

$ sed --version
GNU sed version 4.2.1

@shellter ... ใช่ตัวอย่าง grep นี้ใช้ได้สำหรับฉันเช่นกัน .. ฉันไม่รู้ตัวเลือกนั้นจนกว่าคุณจะโพสต์คำตอบดังนั้นขอบคุณสำหรับสิ่งนั้น ... อย่างไรก็ตาม ฉันยังคงสงสัยว่าถ้ามีวิธีการทั่วไปที่จะทำเช่นนี้ .... เช่นtree is colorized a-la dircolors if the LS_COLORS environment variable is set and output is to tty ... อาจจะ (?) มีวิธีที่จะหลอกให้ท่อคิดว่ามันส่งออกไปยัง TTY .. หรือวิธีแก้ไขปัญหาทั่วไปบางอย่าง .
Peter.O

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