ทำไมเสียงดังกราวสร้างข้อความที่ไม่สามารถเข้าใจได้เมื่อเปลี่ยนเส้นทาง?


20

ฉันพยายามบันทึกผลลัพธ์ของคำสั่งไปยังไฟล์ คำสั่งคือ:

clang -Xclang -ast-dump -fsyntax-only main.cpp > output.txt

อย่างไรก็ตามไฟล์ output.txt ที่เกิดขึ้นเมื่อเปิด (โดย gedit และ jedit บน Ubuntu) ให้สิ่งนี้กับฉัน:

[0;1;32mTranslationUnitDecl[0m[0;33m 0x4192020[0m <[0;33m<invalid sloc>[0m> [0;33m<invalid sloc>[0m
[0;34m|-[0m[0;1;32mTypedefDecl[0m[0;33m 0x4192558[0m <[0;33m<invalid sloc>[0m> [0;33m<invalid sloc>[0m implicit[0;1;36m __int128_t[0m [0;32m'__int128'[0m
[0;34m| `-[0m[0;32mBuiltinType[0m[0;33m 0x4192270[0m [0;32m'__int128'[0m
[0;34m|-[0m[0;1;32mTypedefDecl[0m[0;33m 0x41925b8[0m <[0;33m<invalid sloc>[0m> [0;33m<invalid sloc>[0m implicit[0;1;36m __uint128_t[0m [0;32m'unsigned __int128'[0m
[0;34m| `-[0m[0;32mBuiltinType[0m[0;33m 0x4192290[0m [0;32m'unsigned __int128'[0m
...

เมื่อมันควรมีลักษณะเช่นนี้:

TranslationUnitDecl 0x4e46020 <<invalid sloc>> <invalid sloc>
|-TypedefDecl 0x4e46558 <<invalid sloc>> <invalid sloc> implicit __int128_t '__int128'
| `-BuiltinType 0x4e46270 '__int128'
|-TypedefDecl 0x4e465b8 <<invalid sloc>> <invalid sloc> implicit __uint128_t 'unsigned __int128'
| `-BuiltinType 0x4e46290 'unsigned __int128'
...

ฉันคิดว่ามันอาจจะมีปัญหาของการเข้ารหัสที่ผมตรวจสอบการเข้ารหัสของไฟล์ที่เอาท์พุทfile -bi output.txttext/plain; charset=us-ascii

ฉันคิดว่าถ้าฉันเปลี่ยนการเข้ารหัสเป็น utf-8 ปัญหาจะได้รับการแก้ไขดังนั้นฉันจึงลองทำสิ่งนี้:

clang -Xclang -ast-dump -fsyntax-only main.cpp | iconv -f us-ascii -t UTF-8 > output.txt

แต่มันก็ไม่ได้สร้างความแตกต่าง

ฉันจะทำอย่างไรเพื่อแก้ไขปัญหานี้

ปัญหาไม่ใช่ว่าฉันกำลังพยายามดูเวอร์ชันที่เน้นไวยากรณ์ (ฉันไม่มีปัญหาในการดูในตอนแรก) ฉันต้องการบันทึก AST ที่สร้างโดยเสียงดังกราวไปยังไฟล์แล้วแยกวิเคราะห์ซึ่งจะยากกับข้อมูลสีที่เหลือ


4
มันน่าสังเกต>ว่าไม่ได้สร้างเอาต์พุตมันแค่กำหนดให้เชลล์ที่คุณต้องการใส่เอาท์พุทของclangคำสั่งของคุณลงในไฟล์ที่กำหนดแทนที่จะเป็นเทอร์มินัล หลังจากนั้นคุณดูในลักษณะที่ไม่อนุญาตให้ใช้รหัสสีในลักษณะเดียวกัน หากคุณไปcatที่ไฟล์มันจะทำงานได้เหมือนที่เทอร์มินัลจะเข้าควบคุมและคุณสามารถทำlessเช่นเดียวกันกับการ-Rตั้งค่าสถานะ
Sammitch



@Scott - ฉันไม่ได้พยายามที่จะดูผลลัพธ์ฉันพยายามที่จะบันทึกเป็นไฟล์โดยไม่ทิ้งข้อมูลสีซึ่งจะทำให้การวิเคราะห์ไฟล์ซับซ้อนโดยไม่จำเป็น
maou

คำตอบ:


54

มันไม่มีส่วนเกี่ยวข้องกับ codepages / การเข้ารหัส ผลลัพธ์ของคุณไม่ใช่ข้อความธรรมดา มันมีลำดับ[0;1;32mดังนี้ สตริงเหล่านี้ (มี, ไม่แสดง, ตัวอักษร [หลบหนี] และก่อนหน้านี้) เป็นคำแนะนำไปยังเครื่องเทอร์มินัลเพื่อแสดงข้อความตัวหนาตัวเอียงตัวอักษรในสีต่างๆ ฯลฯ ซึ่งจะทำให้อ่านเอาต์พุตได้ง่ายขึ้น รองรับมัน

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


15
ขอบคุณนั่นเป็นสาเหตุ ฉันพยายามclang -Xclang -ast-dump -fsyntax-only -fno-color-diagnostics main.cpp > output.txtที่ให้ผลลัพธ์ที่ถูกต้องกับฉัน
maou

9
การแก้ไขทางเลือกถ้าเสียงดังกราวเป็นเหตุผลที่มีความประพฤติดี (ซึ่งเห็นได้ชัดว่ามันไม่ได้ถ้ามันส่งรหัสขั้วโดยไม่ตรวจสอบisatty(stdout)) เป็นชุดTERMไป dumb(เช่น)
Toby Speight

4
Re "ผลลัพธ์นี้ง่ายต่อการอ่านเอาต์พุตหากเทอร์มินัลของคุณรองรับ" นั่นคือความคิดเห็น ไม่สามารถใช้วิธีดังกล่าวได้เสมอตัวอย่างเช่นเมื่อแอป colorizing แสดงข้อความสีน้ำเงินเข้มบนพื้นหลังสีดำของคุณ :-(
jamesqf

4
ซอฟต์แวร์ที่มีเหตุผลใด ๆ ควรตรวจสอบว่าผลลัพธ์กำลังถูกเปลี่ยนเส้นทางไปยังไฟล์และปิด colorization ในกรณีนั้น
n0rd

1
@ n0rd จะเป็นการดีใช่ แต่ฉันเคยเห็นสถานการณ์เพียงพอที่ isattty () ไม่ได้รับการผิดพลาดในผลลัพธ์ที่เปลี่ยนเส้นทาง และในบางกรณีผู้ใช้อาจต้องการให้รหัสการเปลี่ยนเส้นทาง (เช่นดูในภายหลังหรือไพพ์ไปยัง netcat เพื่อดูบนระบบอื่นเพียงเพื่อให้ใช้ 2 กรณี) ดังนั้นลองเดา แต่ยังอนุญาตให้ผู้ใช้เปิด / ปิดการเดาในกรณีที่มันผิด นั่นจะเป็นทางออกที่ดีที่สุด
Tonny

12

อีกทางเลือกหนึ่งแทนการลบสีออกจากเอาต์พุตคุณสามารถดูเอาต์พุตสีในเทอร์มินัลของคุณโดยใช้ตัวเลือก raw ของ less

less -r output.txt

2

ตัวละครเหล่านั้นเช่น[0;33mการควบคุมเอาท์พุทเทอร์มินัลสำหรับฉัน พวกเขาเป็นส่วนหนึ่งของชุดลำดับการหลีกเลี่ยงที่มักใช้สำหรับการใช้สีกับข้อความในเทอร์มินัล ในสถานะที่ดิบเช่นนี้มันมักจะใช้สำหรับการปรับสีให้กับ bash prompt ด้วยตัวเอง - นี่คือสิ่งที่ฉันใช้.bashrcมาเป็นเวลาหลายปีกับเครื่องทั้งหมดของฉัน:

export PS1='\[\033[1;33m\]\u\[\033[1;35m\]@\[\033[1;32m\]\h\[\033[0;36m\]\w\[\033[1;37m\]\$ \[\033[0;37m\]'

(ส่วนใหญ่คิดว่ามันน่าเกลียด แต่ฉันชอบมัน)

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


13
[... ] "ดูเหมือนว่าการควบคุมการส่งออกของ bash กับฉัน" พวกเขาไม่มีอะไรเกี่ยวข้องกับการทุบตี มันคือสิ่งที่พวกเขามีไว้เพื่อ terminal
glglgl

1
ตามที่ @glglgl กล่าวว่าพวกเขาไม่ใช่คนทุบตีโดยเฉพาะพวกเขาเป็นxtermสิ่งที่เกี่ยวข้อง ดูคำตอบที่ดีเยี่ยมนี้xtermโดยนักพัฒนานำของ
แมว

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