2009-05-26 11 views
14

मैं एक शेल स्क्रिप्ट लिख रहा हूं जो कमांड लाइन पर एएनएसआई रंग वर्णों का उपयोग करता है।शेल स्क्रिप्ट के आउटपुट स्ट्रीम प्रकार का पता लगाना

उदाहरण: example.sh

#!/bin/tcsh 
printf "\033[31m Success Color is awesome!\033[0m" 

मेरे समस्या है जब कर रही:

$ ./example.sh > out 

या

$./example.sh | grep 

ASCII कोड्स के साथ कच्चे भेजा जाएगा पाठ, आउटपुट को मक्का करना और आम तौर पर अराजकता पैदा करना।

मुझे यह जानने में दिलचस्पी है कि इसका पता लगाने का कोई तरीका है या नहीं, इसलिए मैं इस विशेष मामले के लिए रंग अक्षम कर सकता हूं।

मैंने कुछ समय के लिए tcsh मैन पेज और वेब खोजा है और अभी तक कुछ भी विशिष्ट विशिष्ट नहीं ढूंढ पा रहा है।

मैं टीसीएस के लिए बाध्य नहीं हूं, यह हमारा समूह मानक है ... लेकिन कौन परवाह करता है?

क्या आपके आउटपुट को रीडायरेक्ट या पाइप किया जा रहा है, तो एक शेल स्क्रिप्ट के अंदर, यह पता लगाना संभव है?

+1

हम * बस * यह किया: http://stackoverflow.com/questions/911168/detect-if-shell-script-is-running-through-a-pipe – dmckee

+0

हाहा वह वास्तव में डरावना है कि उसने पूछा जब मैं वास्तव में समस्या में भाग रहा था। मैं वास्तव में सवाल पूछने के लिए चारों ओर मिल गया। –

+0

संबंधित एक: http://unix.stackexchange.com/q/9957/50602 – Palec

उत्तर

13

यह previous SO question देखें, जिसमें बैश शामिल है। मानक उत्पादन एक टर्मिनल है या नहीं, यह देखने के लिए टीसीएस filetest -t 1 के साथ समान कार्यक्षमता प्रदान करता है। यदि ऐसा है, तो रंग सामग्री मुद्रित करें, अन्यथा इसे छोड़ दें। यहाँ tcsh है:

#!/bin/tcsh 
if (-t 1) then 
     printf "\033[31m Success Color is awesome!\033[0m" 
else 
     printf "Plain Text is awesome!" 
endif 
+0

सीएसएच मेरी मूल भाषा नहीं है। प्रारंभिक गुंड के लिए खेद है – dwc

-2

जहां तक ​​मुझे पता है, आपकी शेल स्क्रिप्ट के आउटपुट के अंतिम गंतव्य को निर्धारित करने का कोई तरीका नहीं है; केवल एक चीज जो आप कर सकते हैं वह एक स्विच प्रदान करता है जो आउटपुट में नियंत्रण वर्णों के दमन के लिए अनुमति देता है।

6

एक बोर्न शेल स्क्रिप्ट (sh, bask, ksh, ...) के अंदर, आप tty प्रोग्राम (यूनिक्स में मानक) के मानक आउटपुट को खिला सकते हैं जो आपको बताता है कि इसका इनपुट उपयोग कर रहा है या नहीं -s ध्वज।

"चेक-tty" में निम्नलिखित रखो:

#! /bin/sh 
    if tty -s <&1; then 
     echo "Output is a tty" 
    else 
     echo "Output is not a tty" 
    fi 

और यह प्रयास करें:

% ./check-tty 
    Output is a tty 
    % ./check-tty | cat 
    Output is not a tty 

मैं tcsh का उपयोग नहीं करते हैं, लेकिन अपने मानक आउटपुट पुनर्निर्देशित करने के लिए एक तरह से होना चाहिए tty के मानक इनपुट के लिए। यदि नहीं, तो, अपने tcsh लिपि में

sh -c "tty -s <&1" 
अपने परीक्षण आदेश के रूप में

का उपयोग अपने से बाहर निकलें स्थिति की जाँच और बस हो गया।

+0

sh -c "tty -s <& 1" हमेशा किसी अन्य स्क्रिप्ट के अंदर से कॉल होने पर एक tty वापस नहीं आ जाएगा। हालांकि महान जवाब। –

+0

नहीं, यह नहीं होगा (और मैंने अभी इसका परीक्षण किया है)। –

3

उत्पादन स्ट्रीम प्रकार का पता लगाने के सवाल detect if shell script is running through a pipe में शामिल है।

यह तय करने के बाद कि आप टर्मिनल से बात कर रहे हैं, तो आप tput का उपयोग कर सकते हैं ताकि आप जिस विशेष टर्मिनल का उपयोग कर रहे हैं उसके लिए सही बचने के कोड पुनर्प्राप्त कर सकें - इससे कोड अधिक पोर्टेबल हो जाएगा।

एक उदाहरण स्क्रिप्ट (bash में मुझे डर है, क्योंकि tcsh मेरा फोर्टे नहीं है) नीचे दिया गया है।

#!/bin/bash 

fg_red= 
fg_green= 
fg_yellow= 
fg_blue= 
fg_magenta= 
fg_cyan= 
fg_white= 
bold= 
reverse= 
attr_end= 

if [ -t 1 ]; then 
    fg_red=$(tput setaf 1) 
    fg_green=$(tput setaf 2) 
    fg_yellow=$(tput setaf 3) 
    fg_blue=$(tput setaf 4) 
    fg_magenta=$(tput setaf 5) 
    fg_cyan=$(tput setaf 6) 
    fg_white=$(tput setaf 7) 
    bold=$(tput bold) 
    reverse=$(tput rev) 
    underline=$(tput smul) 
    attr_end=$(tput sgr0) 
fi 

echo "This is ${fg_red}red${attr_end}" 
echo "This is ${fg_green}green${attr_end}" 
echo "This is ${fg_yellow}yellow${attr_end}" 
echo "This is ${fg_blue}blue${attr_end}" 
echo "This is ${fg_magenta}magenta${attr_end}" 
echo "This is ${fg_cyan}cyan${attr_end}" 
echo "This is ${fg_white}white${attr_end}" 
echo "This is ${bold}bold${attr_end}" 
echo "This is ${reverse}reverse${attr_end}" 
echo "This is ${underline}underline${attr_end}" 

अधिक जानकारी के लिए "man tput" देख सकते हैं और "man terminfo" - वहाँ मुक्ति कोड के सभी प्रकार के साथ खेलने के लिए कर रहे हैं।

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