2010-03-25 14 views
10

मेरे पास एक स्क्रिप्ट है। मैं इस स्क्रिप्ट को एक शांत मोड और वर्बोज़ मोड देना चाहता हूं।मैं सशर्त रूप से कमांड के आउटपुट को/dev/null पर कैसे रीडायरेक्ट कर सकता हूं?

इस के बराबर है:

if $verbose 
then 
    redirect="> /dev/null" 
fi 

echo "Verbose mode enabled" $redirect # This doesn't work because the redirect isn't evaluated. 

मैं वास्तव में अगर-elses प्रभावित हर बयान के लिए लिखने की तुलना में ऐसा करने का एक बेहतर तरीका चाहते हैं।

eval काम कर सकता है, लेकिन अन्य चर पर स्पष्ट साइड इफेक्ट्स है।

उत्तर

10

redirect_cmd() { 
    # write your test however you want; this just tests if SILENT is non-empty 
    if [ -n "$SILENT" ]; then 
     "[email protected]" > /dev/null 
    else 
     "[email protected]" 
    fi 
} 

फिर आप रीडायरेक्ट के साथ किसी भी आदेश को चलाने के लिए उपयोग कर सकते हैं:

आप एक आवरण समारोह लिख सकता है

redirect_cmd echo "unsilenced echo" 
redirect_cmd ls -d foo* 

SILENCE=1 
redirect_cmd echo "nothing will be printed" 
redirect_cmd touch but_the_command_is_still_run 

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

+0

मुझे यह समाधान पसंद है। 'इको' सिर्फ एक उदाहरण था। मैं एक बेहतर चुन सकता था। –

+1

उदाहरण गलत है; '$ @" '' '@ @' का उपयोग करें। – vladr

+0

@Vlad: ओह। मुझे नहीं पता कि मेरे सामान्य जुनूनी उद्धरण के साथ क्या हुआ। संपादित! – Cascabel

2

सही नहीं है, लेकिन कैसे या तो "/ dev/बातिल" या "/ dev/tty" पर पुन: निर्देशित की स्थापना, और फिर

{ 
    echo "verbose" 
    .... 
} > $redirect 
+4

'/ dev/stdout','/dev/tty' नहीं। उत्तरार्द्ध का उपयोग हमेशा इसे डिस्प्ले पर जाने का कारण बनता है भले ही स्क्रिप्ट रीडायरेक्ट हो। –

5

करने के बारे में another question से विचार मिल गया:

#!/bin/sh 

if [ $SILENT ]; then 
    exec &>/dev/null 
fi 

echo "Silence here." 
+1

यदि आपके लिए SILENT खाली स्ट्रिंग है तो आपके लिए यह परीक्षण त्रुटियों को देगा। – Cascabel

+2

'अगर [-n" $ SILENT "]' –

0

verbose मोड में stderr के लिए विस्तृत लॉगिंग के लिए set -x सेटिंग के लायक हो। यदि ऐसा है, तो वर्बोज़-आउटपुट आउटपुट को इस तरह नो-ऑप : के साथ हासिल किया जा सकता है।

while getopts "v" o 
do case "$o" in 
    v) set -x;; 
    esac 
done 

echo "This will always be output"   # goes to stdout 
: this will only be output in verbose mode # goes to stderr 

: का मूल्यांकन करता है यह तर्क है, लेकिन उन लोगों के साथ कुछ नहीं करता है। set -x दिखाएगा कि प्रत्येक कथन निष्पादित होने पर stderr पर मूल्यांकन किया गया था।

यह आपको स्ट्रीम द्वारा वर्बोज़ और मानक लॉग को विभाजित करने देता है।

आपको यहां जो चाहिए वह नहीं हो सकता है, लेकिन यह एक आसान चाल हो सकता है।

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

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