สกรีนช็อตปรากฏขึ้นเพื่อแสดงรหัสสี ANSIที่มีการตัดคำซึ่งควบคุมการแสดงข้อความ ข้อความตัวหนา / สว่างเกิดขึ้นตามลำดับ␛[1m
ซึ่งโดยปกติแล้วจะถูกตีความโดยสถานีของคุณและไม่แสดงบนหน้าจอโดยตรง: มันทำให้บิตของข้อความถัดไปสดใส ภาพหน้าจอของgrep
เอาต์พุตun ped แสดงความแตกต่างของสีระหว่างฉลากและค่าในแต่ละบรรทัดดังนั้นเอาต์พุตดั้งเดิมจึงใช้งานได้
ดูเหมือนว่าลำดับนั้นถูกทำลายโดยรอบสุดท้ายของคุณgrep
ซึ่งตรงกับ "m" ในรหัส (เนื่องจากเป็นตัวอักษร[a-z]
) และพยายามเน้นสีแดงเอง ซึ่งเหลือลำดับการหลบหนีบางส่วนไว้ด้านหลังซึ่งเทอร์มินัลของคุณไม่สามารถดำเนินการได้
อักขระเลี่ยง␛
คือ U + 001B ซึ่งเป็นเลขฐานสิบหกที่แสดงในกล่องอักขระที่ไม่รู้จัก สิ่งที่ปรากฏคือการหลบหนี (กล่อง), a [
, a 1
, สีแดงm
ตามด้วยข้อความที่ตรงกับที่คาดไว้ "eng" และเกิดขึ้นแบบเดียวกันในตอนท้ายด้วย "22" (รหัสตัวเลขสำหรับ "สีและความเข้มปกติ")
ผลลัพธ์ที่เสียหายคือ:
␛ [1 ␛ [31m meng ␛ [22m ␛ [22 ␛ [31m m ␛ [22m
โดยที่␛[31m
ทำให้ข้อความเป็นสีแดงและ␛[22m
เปลี่ยนเป็นสีขาวทั้งคู่แทรกโดยgrep
รอบm
ตัวอักษรให้เป็นข้อความต้นฉบับ ต้นฉบับเป็นเพียง:
␛ [1m eng] ␛ [22m
ซึ่งเพิ่งจะสว่าง " eng
" จากนั้นสลับกลับเป็นข้อความปกติ
คุณสามารถตรวจสอบสิ่งนี้ได้โดยเปลี่ยนขั้นตอนสุดท้ายgrep
เป็นgrep --color=always
และส่งไปยังhexdump
ซึ่งจะแสดงอักขระที่ไม่สามารถพิมพ์ได้ทั้งหมดและตัวอักษรที่ตีความโดยเทอร์มินัลของคุณ
คุณสามารถจัดการกับเรื่องนี้ได้หลายวิธี สิ่งหนึ่งคือการใช้grep
โดยไม่ใช้นามแฝงของคุณในขณะนี้:
./trans --id --input /path/to/txt | grep ISO | \grep [a-z]
แบ็กสแลชชั่วคราวจะข้ามนามแฝงและทำงานgrep
โดยตรง
อีกวิธีหนึ่งคือการตัดรหัส ANSI ออกจากคำสั่งดั้งเดิมซึ่งมีคำแนะนำในคำถามนี้ :
./trans --id --input /path/to/txt | perl -pe 's/\e\[[\d;]*m//g' | grep ISO | grep [a-z]
อีกตัวเลือกหนึ่งคือการเพิ่มไปป์ที่ไม่เกี่ยวข้องในตอนท้าย:
./trans --id --input /path/to/txt | grep ISO | grep [a-z] | cat
เนื่องจากgrep
ผลลัพธ์สุดท้ายไม่ใช่โดยตรงไปยัง TTY แต่เพื่อcat
ผ่านไปป์จะไม่แทรกการเน้นสี
บางทีตัวเลือกที่ดีที่สุดคือให้ Translate Shell หยุดใช้ลำดับการควบคุมเทอร์มินัลในเอาต์พุตของตัวเองตั้งแต่แรกเมื่อไม่ได้ไปที่เทอร์มินัล สิ่งนั้นจะเกี่ยวข้องกับรายงานข้อผิดพลาดจากคุณถึงผู้เขียนและการแก้ไขรหัสในการansi()
ทำงานของ Translate Shell แต่มีใครสามารถหลบมันได้บ้าง:
TERM=dumb ./trans --id --input /path/to/txt | grep ISO | grep [a-z]
สิ่งนี้จะผ่านdumb
ประเภทอาคารในสภาพแวดล้อมของ Translate Shell ซึ่งอย่างน้อยจะรับรู้ว่าไม่มีการรองรับสี ECMA-48 (น่าเสียดายที่ Translate Shell ไม่ได้ใช้ terminfo และเพียง แต่ hardwires ในโค้ดของตัวเองประเภทเทอร์มินัลที่เข้าใจและลำดับการควบคุมที่ใช้)