2012-01-06 17 views
18

मेरे पास एक बैश स्क्रिप्ट है जिसे मैं संलग्न होने के बिना चुप रहना चाहता हूं (क्रॉन से)। अब मैं सशर्त रूप से आउटपुट को एक पंक्ति में/dev/null पर रीडायरेक्ट करने का तरीका ढूंढ रहा था। यह है कि मैं क्या मन में था का एक उदाहरण है, लेकिन मैं कई और अधिक आदेशों स्क्रिप्टबाश में सशर्त पुनर्निर्देशन

#!/bin/bash 
# conditional-redirect.sh 
if tty -s; then 
    REDIRECT= 
else 
    REDIRECT=">& /dev/null" 
fi 
echo "is this visible?" $REDIRECT 

दुर्भाग्य में उत्पादन करना होगा, यह काम नहीं करता:

$ ./conditional-redirect.sh 
is this visible? 
$ echo "" | ./conditional-redirect.sh 
is this visible? >& /dev/null 

मैं क्या डॉन ' टी क्या करना चाहते हैं के सभी आदेशों नकल है एक साथ-पुनर्निर्देशन या साथ-नो-पुनर्निर्देशन संस्करण:

if tty -s; then 
    echo "is this visible?" 
else 
    echo "is this visible?" >& /dev/null 
fi 

संपादित करें:

यह अच्छा होगा अगर समाधान मुझे "शांत" मोड में कुछ आउटपुट करने का एक तरीका प्रदान करेगा, उदाहरण के लिए जब कुछ वास्तव में गलत होता है, तो मैं क्रॉन से नोटिस प्राप्त करना चाहता हूं।

exec &>/dev/null 

यह उस बिंदु से सभीstdout और stderr/dev/null को निर्देशित करेंगे:

उत्तर

20

bash के लिए, आप लाइन का उपयोग कर सकते हैं। यह exec के गैर-तर्क संस्करण का उपयोग करता है।

आम तौर पर, exec xyzzy जैसे कुछ प्रोग्राम को वर्तमान प्रक्रिया में एक नए प्रोग्राम के साथ बदल दिया जाएगा, लेकिन आप वर्तमान प्रोग्राम को रखते हुए पुनर्निर्देशन को संशोधित करने के लिए इस गैर-तर्क संस्करण का उपयोग कर सकते हैं।

तो, अपने विशिष्ट मामले में, आप की तरह कुछ इस्तेमाल कर सकते हैं:

tty -s 
if [[ $? -eq 1 ]] ; then 
    exec &>/dev/null 
fi 

यदि आप चाहते हैं उत्पादन के बहुमत खारिज किया जा करने के लिए, लेकिन अभी भी उत्पादन के लिए कुछ सामान चाहते हैं, आप के लिए एक नई फ़ाइल संभाल बना सकते हैं वो करें। कुछ की तरह:

tty -s 
if [[ $? -eq 1 ]] ; then 
    exec 3>&1 &>/dev/null 
else 
    exec 3>&1 
fi 
echo Normal    # won't see this. 
echo Failure >&3   # will see this. 
+1

हां, यह काम करता है ! (या यहां तक ​​कि सरल 'exec &>/dev/null') –

+0

.. लेकिन इसमें नकारात्मकता है कि सभी आउटपुट "शांत" मोड में खो गए हैं; ऐसी परिस्थितियां हो सकती हैं जहां मैं वास्तव में कुछ आउटपुट करना चाहता हूं, यहां तक ​​कि queit मोड में भी; अपरिवर्तित प्रश्न देखें। –

+0

अच्छा बिंदु, @ डैनियल, मुझे दांत में थोड़ी देर लग रही है और पुरानी आदतें मुश्किल से मरती हैं लेकिन मैंने आपके पसंदीदा तरीके से जवाब अपडेट किया है। – paxdiablo

2

मैं एक और समाधान पाया है, लेकिन मुझे लगता है यह करने के लिए paxdiablo के answer तुलना में अनाड़ी है,:

if tty -s; then 
    REDIRECT=/dev/tty 
else 
    REDIRECT=/dev/null 
fi 
echo "Normal output" &> $REDIRECT 
+2

यह काम करेगा, लेकिन केवल अगर आउटपुट रीडायरेक्ट नहीं किया गया है। '/ dev/tty' हमेशा आपके टर्मिनल डिवाइस को संदर्भित करता है, इसलिए यदि आपने अपनी स्क्रिप्ट को 'myscript> xyzzy.log' के साथ चलाया है, तो आप जिस आउटपुट को'/dev/tty' पर भेजते हैं वह उस लॉग फ़ाइल में समाप्त नहीं होगा । इससे कोई फर्क नहीं पड़ता कि यह इस बात पर निर्भर करता है कि आप अपने प्रोग्राम का उपयोग कैसे करना चाहते हैं। – paxdiablo

1

आप एक समारोह का उपयोग कर सकते हैं:

function the_code { 
    echo "is this visible?" 
    # as many code lines as you want 
} 

if tty -s; then # or other condition 
    the_code 
else 
    the_code >& /dev/null 
fi 
संबंधित मुद्दे