पुनर्निर्देशित होने पर क्लैंग अचिंत्य पाठ क्यों उत्पन्न करता है?


20

मैं एक फ़ाइल में कमांड के आउटपुट को बचाने की कोशिश कर रहा हूं। आदेश है:

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

हालाँकि परिणामी आउटपुट। Txt फ़ाइल जब खोली जाती है (ubuntu पर gedit और jedit द्वारा) तो यह मुझे देता है:

[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.txtजो आउटपुट करती है text/plain; charset=us-ascii

मुझे लगा कि अगर मैं एन्कोडिंग को utf-8 में बदल दूं तो समस्या ठीक हो जाएगी इसलिए मैंने यह कोशिश की:

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

लेकिन इससे कोई फर्क नहीं पड़ा।

यह समस्या सुलझाने के लिए मैं क्या कर सकता हूं?

समस्या यह नहीं है कि मैं सिंटैक्स-हाइलाइट किए गए संस्करण को देखने की कोशिश कर रहा हूं (मुझे पहली बार इसे देखने में कोई समस्या नहीं है)। मुझे एक फ़ाइल से चिपके हुए एएसटी को बचाने और फिर उसे पार्स करने की आवश्यकता है, जिसमें रंग की जानकारी को छोड़ दिया जाना मुश्किल होगा।


4
यह ध्यान देने योग्य है कि >आउटपुट उत्पन्न नहीं करता है, यह केवल उस शेल को निर्दिष्ट करता है जो आप clangदिए गए फ़ाइल में अपने कमांड के आउटपुट को टर्मिनल के बजाय रखना चाहते हैं । उसके बाद आप इसे इस तरीके से देख रहे हैं जो उसी तरह से रंग कोड की अनुमति नहीं देता है। यदि आप catफ़ाइल में थे तो यह टर्मिनल के रूप में काम करेगा और आप ध्वज के lessसाथ भी ऐसा कर सकते हैं -R
सैममिच



@ सेट - मैं आउटपुट देखने की कोशिश नहीं कर रहा हूं, मैं इसे रंग जानकारी में छोड़ने के बिना फाइल को सहेजने की कोशिश कर रहा हूं, जो फ़ाइल को अनावश्यक रूप से जटिल बना देगा।
मऊ

जवाबों:


54

इसका कोडप्स / एन्कोडिंग से कोई लेना-देना नहीं है। आपका आउटपुट सादा पाठ नहीं है। इसमें जैसे क्रम होते हैं [0;1;32m। ये तार (इनमें से प्रत्येक से पहले [नहीं, [बच] चरित्र] के रूप में दिखाया गया है) पाठ को बोल्ड, इटैलिक, विभिन्न रंगों में दिखाने के लिए टर्मिनल के निर्देश हैं, आदि। इससे आउटपुट पढ़ने में आसानी होती है, यदि आपका टर्मिनल। इसका समर्थन करता है।

क्लैंग को यह बताने का विकल्प होना चाहिए कि आउटपुट को सुशोभित करने की कोशिश न करें, बल्कि इसके बजाय सादे पाठ का उपयोग करें। मैनुअल की जाँच करें। (मेरे पास एक काम नहीं है, इसलिए मैं आपको यह नहीं बता सकता कि उचित आदेश क्या होगा।)


15
धन्यवाद, यही कारण था। मैंने कोशिश की clang -Xclang -ast-dump -fsyntax-only -fno-color-diagnostics main.cpp > output.txtजिससे मुझे सही आउटपुट मिले।
माऊ

9
एक वैकल्पिक निर्धारण, यदि क्लैंग को अच्छी तरह से व्यवहार किया गया है (जो कि स्पष्ट रूप से ऐसा नहीं है, अगर यह बिना जाँच के टर्मिनल कोड भेज रहा है isatty(stdout)) TERM(जैसे) सेट करना है dumb
स्पाइट

4
पुन: "इसका परिणाम आउटपुट पढ़ने में आसान होता है, यदि आपका टर्मिनल इसका समर्थन करता है।", निश्चित रूप से, एक राय है। हमेशा इस तरह से काम नहीं करता है, उदाहरण के लिए जब रंगाई ऐप आपके काले रंग की पृष्ठभूमि पर गहरे नीले रंग का टेक्स्ट आउटपुट करता है :-(
jamesqf

4
सॉफ्टवेयर के किसी भी वाजिब टुकड़े का पता लगाना चाहिए कि उसके आउटपुट को उस मामले में फ़ाइललाइजेशन को फाइल करने और बंद करने के लिए रीडायरेक्ट किया जा रहा है।
n0rd

1
@ n0rd आदर्श रूप से हाँ, लेकिन मैंने पर्याप्त स्थितियों को देखा है जहाँ पर अनुप्रेषित () पुनर्निर्देशित आउटपुट पर गलत नहीं दिया गया था। और कुछ मामलों में एक उपयोगकर्ता चाहते हो सकता है कि एस्केप कोड पुनर्निर्देशित हो जाएं (जैसे बाद में देखने के लिए या किसी अन्य सिस्टम पर देखने के लिए पाइप, बस 2 उपयोग-मामलों को देने के लिए)। तो अनुमान लगाने की कोशिश करें, लेकिन उपयोगकर्ता को यह गलत होने की स्थिति में अनुमान को ओवरराइड करके चालू / बंद करने की अनुमति दें। यही सबसे अच्छा समाधान होगा।
टन

12

वैकल्पिक रूप से, आउटपुट से रंगों को हटाने के बजाय, आप अपने टर्मिनल में रंगीन आउटपुट को कच्चे विकल्प का उपयोग करके देख सकते हैं less

less -r output.txt

2

वे पात्र, जैसे कि [0;33mटर्मिनल आउटपुट मुझे नियंत्रित करते हैं। वे भागने के दृश्यों के एक सेट का हिस्सा हैं जो अक्सर टर्मिनल में पाठ को रंग लगाने के लिए उपयोग किया जाता है। इस तरह इसकी कच्ची अवस्था में इसका उपयोग अक्सर बाश प्रॉम्प्ट में रंग लगाने के लिए भी किया जाता है - यहाँ मैं .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
[...] "मेरे लिए बैश के आउटपुट नियंत्रण की तरह दिखते हैं" उन्हें बैश से कोई लेना देना नहीं है। यह वह टर्मिनल है जिसके लिए वे हैं।
ग्लोगल

1
जैसा कि @glglgl ने कहा, वे बैश-विशिष्ट नहीं हैं, वे एक- xtermसंबंधित चीज़ हैं। के प्रमुख डेवलपर द्वारा इस उत्कृष्ट उत्तर को देखें xterm
बिल्ली

@glglgl का ठीक है, उत्तर तदनुसार संपादित किया गया। मैंने पहली बार इसे कुछ साल पहले fBSD से लिनक्स में माइग्रेट करते समय देखा था, जो तब भी था जब मैंने बैश का उपयोग करना शुरू किया था, इसलिए मुझे लगा कि यह बाद का एक उत्पाद है।
जरमुंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.