2010-01-08 18 views
10

में प्रक्रिया आउटपुट को रीडायरेक्ट किया जा रहा है या नहीं, मैं लिनक्स के लिए कमांड लाइन उपयोगिता लिख ​​रहा हूं। यदि आउटपुट (stdout) एक खोल पर जा रहा है तो आउटपुट को रंगीन करने के लिए कुछ एस्केप प्रिंट करना अच्छा होगा। लेकिन अगर आउटपुट को रीडायरेक्ट किया जा रहा है तो उन बैश से बचने के लिए प्रिंट नहीं किया जाना चाहिए, या सामग्री उस आउटपुट पर निर्भर पार्सर्स को तोड़ सकती है।यह निर्धारित करें कि सी/सी ++

ऐसा कई प्रोग्राम हैं जो ऐसा करते हैं (ack के रूप में चूसते हैं) लेकिन जिन्हें मैंने पाया वह पर्ल में लिखा गया था और मुझे पता नहीं चला कि उन्होंने यह कैसे किया।

मैं अपनी उपयोगिता लिखने के लिए सी/सी ++ का उपयोग करना चाहता था।

उत्तर

12

आप लिनक्स पर isatty का उपयोग कर सकते हैं। यह फ़ंक्शन स्पष्ट रूप से मानक सी नहीं है, उदाहरण के लिए - कई प्लेटफ़ॉर्म पर आप आउटपुट को किसी फ़ाइल में रीडायरेक्ट नहीं कर सकते हैं।

+6

'isatty()' मानक सी नहीं है, लेकिन यह पॉज़िक्स है, इसलिए यह सभी यूनिक्स-जैसे प्लेटफार्मों पर उपलब्ध होगा। –

+0

आईएसओ संस्करण भी विंडोज़ पर उपलब्ध है। काफी साफ़। –

4

(गैर-मानक) सी में, आप isatty() का उपयोग कर सकते हैं।

 
$ perl -E 'say -t STDOUT' 
1 
$ perl -E 'say -t STDOUT' | cat 

$ 

खोल आप परीक्षण का उपयोग कर सकते में:

int is_redirected(){ 
    if (!isatty(fileno(stdout))){ 
     fprintf(stdout, "argv, argc, someone is redirecting me elsewhere...\n"); 
     return 1; 
    } 
    return 0; 
} 

/* ... */ 
int main(int argc, char **argv){ 
    if (is_redirected()) exit(-1); 
    /* ... */ 
} 

कि समारोह:

 
$ test -t 1 && echo is a tty 
is a tty 
$ (test -t 1 && echo is a tty) | cat 
$ 
+0

मुझे वास्तव में पर्ल और शैल में परीक्षण पसंद आया। बहुत अच्छा। –

7

इस कोड पर एक नज़र डालें पर्ल में, यह आयकर ऑपरेटर के साथ किया जाता है यदि प्रोग्राम रीडायरेक्ट किया जा रहा है तो 1 वापस आ जाएगा। main(...) में नोटिस कैसे कहा जाता है। यदि कार्यक्रम चलाने के लिए था और stderr पर रीडायरेक्ट किया जा रहा है या फ़ाइल में प्रोग्राम तुरंत बाहर निकलता है।

+1

'' fileno() '' '' '' '_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ – nimrodm

संबंधित मुद्दे