2010-01-26 4 views
8

जब आप git का उपयोग करते हैं तो यह जादुई रूप से पता चलता है कि मानक आउट एक पाइप के माध्यम से या फ़ाइल बनाम कंसोल पर प्रदर्शित होने पर बना रहा है या नहीं। उदाहरण के लिए, यदि आपके पास रंग सक्षम हैं और आपलिनक्स में, मैं कैसे परीक्षण कर सकता हूं कि किसी प्रोग्राम का आउटपुट लाइव टर्मिनल या फ़ाइल में जा रहा है या नहीं?

git status 

यह सूचीबद्ध होने वाली विभिन्न श्रेणियों के आउटपुट को रंगीन करेगा। हालांकि, अगर आप कर

git status | less 

या

git status > status.txt 

यह linux color formatting दूर करता है और आप केवल सादा, uncolored पाठ को देखने।

git कैसे पता चलता है कि इसके आदेशों का आउटपुट टर्मिनल पर जा रहा है या नहीं?

+3

मुझे नहीं लगता कि यह है कि इस, सुपर उपयोगकर्ता पर होना चाहिए के रूप में ओ पी वास्तव में की तलाश में है कैसे कार्यक्रम यानी करता है। गिट पता लगाता है कि इसे कहां रीडायरेक्ट किया जा रहा है या नहीं। – t0mm13b

+2

मैं @ tommieb75 से सहमत हूं यह एक एपीआई प्रश्न है, मैं व्यवस्थापक सवाल कैसे नहीं कर सकता। –

+0

वैसे, अगर आप केवल उत्सुक नहीं थे, और आप यह पूछ रहे थे क्योंकि आप रंगीन * और * गेट से पजे हुए आउटपुट चाहते थे, तो आप 'core.pager' (कम) जैसे 'गिट कॉन्फ़िगरेशन' सेटिंग्स के साथ गड़बड़ कर सकते हैं। और 'color.pager' (सत्य)। http://www.kernel.org/pub/software/scm/git/docs/git-config.html – rescdsk

उत्तर

14

isatty(int fd) यह जांच करेगा कि एफडी टर्मिनल या कुछ और को संदर्भित करता है या नहीं। यह जीएनयू सी पुस्तकालय में unistd.h का हिस्सा है।

मैन पेज: http://linux.die.net/man/3/isatty

के रूप में एक अलग रूप में: यदि आप किसी अन्य प्रोग्राम का उपयोग कर एक कार्यक्रम से पढ़ना चाहते हैं, लेकिन आप यह सोच कर कि अपने कार्यक्रम के लिए एक मानव है में isatty मूर्ख करना चाहते हैं, वहाँ ऐसा करने के लिए एक रास्ता है । आप pseudo-terminal (पीटीआई) का उपयोग कर सकते हैं। उदाहरण के लिए, इस तकनीक का उपयोग expect द्वारा किया जाता है।

8

यह कैसे करता है, तो मानक आउटपुट रीडायरेक्ट किया जाता है पता लगाने के लिए प्रदर्शित करने के लिए एक सी कोड है:

 
int main(int argc, char **argv){ 
    if (!isatty(fileno(stdout))){ 
     fprintf(stdout, "argv, argc, someone is redirecting me elsewhere...\n"); 
     return 1; 
    } 
    /* rest of C code here... */ 
} 

है कि कैसे Git जानता उत्पादन टर्मिनल के लिए या एक फ़ाइल के लिए जा रहा है या नहीं।

3

पुष्टि कर सकते हैं कि क्या Git पर निर्भर करता है है: Git स्रोत पेड़ के खिलाफ

$ grep -ir "isatty" ./* 
./builtin-commit.c:  if (isatty(0)) 
./builtin-config.c:   stdout_is_tty = isatty(1); 
./builtin-pack-objects.c: progress = isatty(2); 
./builtin-prune-packed.c: int opts = isatty(2) ? VERBOSE : 0; 
./builtin-revert.c: if (isatty(0)) 
./builtin-shortlog.c: if (!nongit && !rev.pending.nr && isatty(0)) 
./builtin-unpack-objects.c: quiet = !isatty(2); 
./color.c:  stdout_is_tty = isatty(1); 
./compat/winansi.c: if (!isatty(fileno(stream))) 
./compat/winansi.c: if (!isatty(fileno(stream))) 
./pack-redundant.c: if (!isatty(0)) { 
./pager.c: if (!isatty(1)) 
./pager.c: if (isatty(2)) 
./remote-curl.c: options.progress = !!isatty(2); 
./transport.c: args.no_progress = args.quiet || (!transport->progress && !isatty(1)); 
./transport-helper.c: int no_progress = v < 0 || (!t->progress && !isatty(1)); 
./wt-status.c: * will have checked isatty on stdout). 

भागो।

ध्यान दें कि एफडीएस 0 = stdin, 1 = stdout, 2 = stderr डिफ़ॉल्ट रूप से, लेकिन इन्हें निश्चित रूप से फिर से निर्देशित या बंद किया जा सकता है (आमतौर पर यदि आप एक डिमन हैं तो आप अपनी फ़ाइल डिस्क्रिप्टर बंद करते हैं और फिर से खोलते हैं तुम्हें चाहिए)।

2

एक शेल स्क्रिप्ट से, फ़ाइल वर्णनकर्ता 0 (मानक इनपुट) पर लागू -t परीक्षण ध्वज का उपयोग करें।

उदाहरण:

# Any Bourne-style shell 
[ -t 0 ] && echo This is a terminal 

# Modern interactive shells: ksh, bash, zsh 
[[ -t 0 ]] && echo This is a terminal 
संबंधित मुद्दे

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