2009-05-30 13 views
19

के लिए कोई कमांड-लाइन शॉर्टकट है जब भी मैं प्रोग्राम के आउटपुट को देखना नहीं चाहता हूं, इसे टाइप करना वाकई परेशान है। मैं लिखने के लिए एक छोटा रास्ता है अगर जानकर प्रसन्नता होगी:क्या ">/dev/null 2> और 1"

$ program >/dev/null 2>&1 

जेनेरिक खोल सबसे अच्छा है, लेकिन अन्य गोले के बारे में भी, विशेष रूप से पार्टी या पानी का छींटा जानना दिलचस्प होगा।

ln -s /dev/null /n 

तो फिर तुम बस सकता है::

program >/n 2>&1 

लेकिन निश्चित रूप से, लिपियों

उत्तर

14
>& /dev/null 
+0

धन्यवाद, यह अच्छा है (उसे नहीं पता था) लेकिन मुझे यह निर्दिष्ट करना चाहिए था कि "शॉर्टकट" का अर्थ आधे से कम वर्णों से कम है। यह लगभग उतना ही टाइपिंग है। वास्तव में 2> और 1 भाग आसान है, यह/dev/null है जो टाइप करने के लिए परेशान है। –

+3

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

+7

बैश मैनुअल "> & dev" के साथ संभव अस्पष्टताओं से बचने के लिए "&>/dev/null" फ़ॉर्म को पसंद करता है (जहां n एक पूर्णांक है)। मुझे नहीं लगता कि यह बैश के बाहर पोर्टेबल है, हालांकि। – ephemient

1

तो /dev/null भी टाइप करने के लिए बहुत कुछ है, तो आप कर सकता है (रूट के रूप में) कुछ पसंद है आप इस तरह से लिखते हैं कि पहले सिमलिंक को सेट किए बिना अन्य सिस्टमों के लिए पोर्टेबल नहीं होगा।

+0

उपर्युक्त उत्तर के साथ संयोजन, मुझे लगता है कि मैं कर सकता था: प्रोग्राम और>/n जो बहुत अच्छा है। धन्यवाद! –

+1

प्रोग्राम> &/n –

6

अधिकांश गोले उपनाम का समर्थन करते हैं। उदाहरण के लिए, मेरी .zshrc में मैं जैसी चीजों है:

alias -g no='2> /dev/null > /dev/null' 

तब मैं सिर्फ टाइप

program no 
+2

बैश में होना चाहिए: यह होगा: उपनाम संख्या = '2>/dev/null>/dev/null'; कोई आदेश arg arg – lhunath

13

आप इस के लिए एक समारोह लिख सकते हैं:

function nullify() { 
    "[email protected]" >/dev/null 2>&1 
} 

इस सुविधा का उपयोग करने के लिए:

nullify program arg1 arg2 ... 

बेशक, आप टी नाम दे सकते हैं वह जो कुछ भी आप चाहते हैं वह काम करता है। उदाहरण के लिए यह एक एकल चरित्र हो सकता है।

वैसे, आप exec का उपयोग अस्थायी रूप से stdout और stderr/dev/null को अनुप्रेषित कर सकते हैं। मुझे नहीं पता कि यह आपके मामले में सहायक है, लेकिन मैंने इसे साझा करने के बारे में सोचा।

# Save stdout, stderr to file descriptors 6, 7 respectively. 
exec 6>&1 7>&2 
# Redirect stdout, stderr to /dev/null 
exec 1>/dev/null 2>/dev/null 
# Run program. 
program arg1 arg2 ... 
# Restore stdout, stderr. 
exec 1>&6 2>&7 
0

मुझे लगता है कि सबसे पोर्टेबल समाधान, और सबसे अच्छा जवाब, आपके टर्मिनल (पीसी) पर एक मैक्रो होगा।

इस तरह, कोई फर्क नहीं पड़ता कि आप किस सर्वर में लॉग इन करते हैं, यह हमेशा वहां रहेगा।

यदि आप विंडोज़ चलाने के लिए होते हैं, तो आप कोड की दो छोटी पंक्तियों में एएचके (Google इसे, यह ओपनसोर्स) के साथ वांछित परिणाम प्राप्त कर सकते हैं। यह सीटू में किसी भी अन्य स्ट्रिंग की चाबियों में कुंजियों की किसी भी स्ट्रिंग का अनुवाद कर सकता है।

आप "ugly.sh >> NULL" टाइप करते हैं और यह इसे "ugly.sh 2> & 1>/dev/null" या नहीं के रूप में फिर से लिख देगा।

अन्य प्लेटफार्मों के लिए समाधान कुछ और कठिन हैं। ऐप्पलस्क्रिप्ट कुंजीपटल प्रेस में पेस्ट कर सकता है, लेकिन इसे आसानी से ट्रिगर नहीं किया जा सकता है।

8

बैश, zsh में, और पानी का छींटा:

$ program >&- 2>&- 

यह भी अन्य गोले में काम करने के लिए क्योंकि &- एक बुरा फ़ाइल की जानकारी देता है प्रकट हो सकता है।

ध्यान दें कि यह समाधान उन्हें /dev/null के लिए पुनः निर्देशित है, जो संभवतः निरस्त करने के लिए कार्यक्रमों का कारण बन सकता बजाय फ़ाइल वर्णनकर्ता बंद कर देता है।

+0

"संभावित रूप से" हो सकता है? मैं उसे "आमतौर पर करता हूं" कहूंगा। वे प्रोग्राम जो जांच नहीं करते हैं कि उनके लेखन सफल हैं * बग्गी *। –

+0

यदि मैं सही हूं, तो 'sh' किसी दिए गए वितरण के लिए डिफ़ॉल्ट खोल का नाम है, जबकि 'dash' नाम' ash 'के डेबियन संस्करण को दिया गया है। देखें [विकिपीडिया] (https://en.wikipedia.org/wiki/Dash_ (खोल))। क्या आप कृपया स्पष्टीकरण दे सकते हैं? – loxaxs

+0

@ लोक्सैक्स: उबंटू में, 'sh' अब' डैश 'चलाता है। मुझे याद नहीं है कि लेखन के समय मेरे लिए क्या किया गया था (मुझे लगता है कि मुझे पॉज़िक्स संगतता मोड में 'बाश' चलाने के बारे में कुछ याद है), लेकिन मैंने अस्पष्टता के कारण इसे हटा दिया है। – Zaz

2

ऐसा नहीं है कि अक्सर कई बार उत्पादन पुनः निर्देशित वास्तव में आवश्यक नहीं है, ध्यान देने योग्य भी है। कई यूनिक्स और लिनक्स प्रोग्राम "मूक ध्वज" स्वीकार करते हैं, आमतौर पर -n या -q, जो किसी भी आउटपुट को दबाता है और केवल सफलता या विफलता पर एक मूल्य देता है।

उदाहरण

grep foo bar.txt >/dev/null 2>&1 
if [ $? -eq 0 ]; then 
    do_something 
fi 

के लिए के रूप में

grep -q foo bar.txt 
if [ $? -eq 0 ]; then 
    do_something 
fi 
+0

'$?' की जांच करना अनावश्यक रूप से खराब रूप है, 'grep -q foo bar.txt के विपरीत; फिर '- यह आपके कोड को नाजुक बनाता है, जैसे कि नए जोड़े गए लॉग लाइन आपके परीक्षण तोड़ सकती हैं अगर कोई ऐसा लॉग इंस्ट्रूमेंटेशन कर रहा है, तो इस बारे में सतर्क नहीं है कि '$?' अपरिवर्तित रहने की उम्मीद है। –

2

संपादित फिर से लिखा जा सकता है: (:) या |: आधारित समाधान एक त्रुटि के कारण हो सकता है क्योंकि :stdin पढ़ा नहीं है। हालांकि यह ज़ाज़ के उत्तर में प्रस्तावित फ़ाइल डिस्क्रिप्टर को बंद करने के रूप में बुरा नहीं हो सकता है।


  • बैश और बैश अनुरूप गोले के लिए (zsh ...):

    $ program &>/dev/null 
    OR 
    $ program &> >(:) # Should actually cause error or abortion 
    
  • सभी गोले के लिए:

    $ program 2>&1 >/dev/null 
    OR 
    $ program 2>&1|: # Should actually cause error or abortion 
    

    $ program 2>&1 > >(:) पानी का छींटा क्योंकि लिए काम नहीं करता यह फ़ाइल प्रतिस्थापन के अधिकार प्रतिस्थापन अधिकार को संचालित करने से इंकार कर देता है।

स्पष्टीकरण:

  • 2>&1 stdout (फ़ाइल वर्णनकर्ता 1) को stderr (फ़ाइल वर्णनकर्ता 2) पुनर्निर्देश।
  • | एक और आदेश के stdin के लिए stdout का नियमित रूप से पाइपिंग है।
  • : एक खोल निर्मित जो कुछ नहीं करता है (यह true के बराबर है)।
  • &> एक फाइल करने के लिए दोनों stdout और stderr आउटपुट पुनर्निर्देश।
  • >(your-command) प्रक्रिया प्रतिस्थापन है। इसे एक विशेष फ़ाइल के पथ के साथ प्रतिस्थापित किया गया है, उदाहरण के लिए: /proc/self/fd/6। इस फ़ाइल को your-command कमांड के लिए इनपुट फ़ाइल के रूप में उपयोग किया जाता है।

नोट: एक बंद फ़ाइल वर्णनकर्ता में लिखने के लिए एक EBADF (बुरा फ़ाइल वर्णनकर्ता) त्रुटि जो अधिक | true लिखने के लिए कोशिश कर रहा से गर्भपात की संभावना के कारण मिल जाएगा की कोशिश कर रहा एक प्रक्रिया। उत्तरार्द्ध EPIPE (पाइप) त्रुटि का कारण बनता है, चार्ल्स डफी की टिप्पणी देखें।

+0

मैं काफी "समकक्ष" नहीं कहूंगा; '> & -' * वास्तव में * वर्णनकर्ता को बंद कर देता है, और व्यवहार अलग है (एक बंद करने के लिए लिखता है, और इस प्रकार कोई भी नहीं, एफडी परिणाम एक अलग, अधिक संभावना-से-घातक त्रुटि में)। –

+0

'पायथन-सी' प्रिंट "हैलो" की तुलना करें> & - ', 'पायथन-सी' प्रिंट" हैलो "'| सच 'और' पायथन-सी 'प्रिंट "हैलो"'>/dev/null'। – loxaxs

+1

'... | सत्य 'रिटर्न' ईपीआईपीई ', जबकि '> और -' ईबीएडीएफ' लौटाता है - दो पूरी तरह से अलग त्रुटियां। कि पाइथन रनटाइम उनके बीच उपयोगी रूप से अंतर नहीं करता है न तो यहां और न ही वहां। –

1

Ayman Hourieh's solution अत्यधिक चैट कार्यक्रमों के एक-एक आमंत्रण के लिए अच्छा काम करता है। लेकिन अगर केवल आमतौर पर कहा जाता कार्यक्रमों जिसके लिए आप उत्पादन को दबाने के लिए चाहते हैं का एक छोटा सेट है, अपने .bashrc फ़ाइल में निम्न जोड़कर उन्हें सायलेंसिंग पर विचार (या समकक्ष यदि आप किसी अन्य खोल का उपयोग करें):

CHATTY_PROGRAMS=(okular firefox libreoffice kwrite) 
for PROGRAM in "${CHATTY_PROGRAMS[@]}" 
do 
    printf -v eval_str '%q() { command %q "[email protected]" &>/dev/null; }' "$PROGRAM" "$PROGRAM" 
    eval "$eval_str" 
done 

यह जिस तरह से आप अपने सामान्य नामों का उपयोग करके प्रोग्राम्स का आह्वान करना जारी रख सकते हैं, लेकिन उनके स्टडआउट और स्टडरर आउटपुट बिट बाल्टी में गायब हो जाएंगे।

ध्यान दें कि कुछ प्रोग्राम आपको कॉन्फ़िगर करने की अनुमति देते हैं कि वे कितनी लॉगिंग/डिबगिंग आउटपुट को स्पू करते हैं। केडीई अनुप्रयोगों के लिए, आप kdebugdialog चला सकते हैं और चुनिंदा या वैश्विक रूप से डिबगिंग आउटपुट अक्षम कर सकते हैं।

+1

स्ट्रिंग का उपयोग क्यों करें जैसे कि यह एक सूची थी? यदि आप मूल बैश लिख रहे हैं (और 'फ़ंक्शन' कीवर्ड का उपयोग करने का अर्थ है कि आपका कोड * पोर्टेबल होने की कोशिश नहीं कर रहा है; POSIX), तो आपको सरणी होने की गारंटी है; 'chatty_programs = (ठीक है फ़ायरफ़ॉक्स जो कुछ भी); कार्यक्रम के लिए "$ {chatty_programs [@]}"; do'; इस तरह आपका कोड आईएफएस के वर्तमान मूल्य पर निर्भर नहीं है। –

+1

मैं शैल को आपके लिए उद्धरण निष्पादित करने पर भी विचार करता हूं: 'printf -v eval_str '% q() {command% q" $ @ "&>/dev/null; } '' $ प्रोग्राम "" $ प्रोग्राम "; eval "$ eval_str" - इस तरह अगर कोई मुहावरे उधार लेता है और इसे इनपुट नामों के साथ चलाता है तो वे नियंत्रण नहीं करते हैं, कुछ जोकर '$ (rm -rf ~) 'नामक एक स्क्रिप्ट बनाते हैं (हाँ, यह एक वैध फ़ाइल नाम है - - अगर इसे बनाने की कोशिश कर रहे हैं तो सिंगल कोट्स का उपयोग करना सुनिश्चित करें) उन्हें खराब दिन नहीं लगेगा। –

+0

@ चार्ल्स डफी: आप सही हैं; सुझाए गए सुधारों के लिए धन्यवाद। मैंने तदनुसार अपना जवाब संशोधित कर दिया है। – Psychonaut

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