बश में कमांड आउटपुट कैसे छिपाएं


99

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

उदाहरण के लिए, जब बैश निष्पादित होता है

yum install nano

निम्नलिखित उन उपयोगकर्ता को दिखाएगा जिन्होंने बैश को अंजाम दिया था:

Loaded plugins: fastestmirror
base                                                     | 3.7 kB     00:00
base/primary_db                                          | 4.4 MB     00:03
extras                                                   | 3.4 kB     00:00
extras/primary_db                                        |  18 kB     00:00
updates                                                  | 3.4 kB     00:00
updates/primary_db                                       | 3.8 MB     00:02
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package nano.x86_64 0:2.0.9-7.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package         Arch              Version                Repository       Size
================================================================================
Installing:
 nano            x86_64            2.0.9-7.el6            base            436 k

Transaction Summary
================================================================================
Install       1 Package(s)

Total download size: 436 k
Installed size: 1.5 M
Downloading Packages:
nano-2.0.9-7.el6.x86_64.rpm                              | 436 kB     00:00
warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Importing GPG key 0xC105B9DE:
 Userid : CentOS-6 Key (CentOS 6 Official Signing Key) <centos-6-key@centos.org>
 Package: centos-release-6-4.el6.centos.10.x86_64 (@anaconda-CentOS-201303020151.x86_64/6.4)
 From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : nano-2.0.9-7.el6.x86_64                                      1/1
  Verifying  : nano-2.0.9-7.el6.x86_64                                      1/1

Installed:
  nano.x86_64 0:2.0.9-7.el6

Complete!

अब मैं इसे उपयोगकर्ता से छिपाना चाहता हूं और इसके बजाय दिखाना चाहता हूं:

    Installing nano ......

मैं इस कार्य को कैसे पूरा कर सकता हूं? मैं निश्चित रूप से स्क्रिप्ट को अधिक उपयोगकर्ता के अनुकूल बनाने में मदद करूंगा। यदि कोई त्रुटि होती है, तो उसे उपयोगकर्ता को दिखाया जाना चाहिए।

मैं जानना चाहूंगा कि एक ही संदेश कैसे दिखाया जाए जबकि कमांड के एक सेट को निष्पादित किया जा रहा है।


4
echo "Installing nano ......"; yum install nano &> /dev/null
user000001


जवाबों:


246

इसे इस्तेमाल करो।

{
  /your/first/command
  /your/second/command
} &> /dev/null

व्याख्या

कमांड से आउटपुट को खत्म करने के लिए, आपके पास दो विकल्प हैं:

  • आउटपुट डिस्क्रिप्टर फ़ाइल को बंद करें, जो इसे किसी भी अधिक इनपुट को स्वीकार करने से रोकता है। यह इस तरह दिखता है:

    your_command "Is anybody listening?" >&-

    आमतौर पर, आउटपुट डिस्क्रिप्टर 1 (stdout) या 2 (stderr) फाइल करने के लिए जाता है। यदि आप एक फ़ाइल डिस्क्रिप्टर को बंद करते हैं, तो आपको प्रत्येक गिने हुए डिस्क्रिप्टर के लिए ऐसा करना होगा, क्योंकि &>(नीचे) एक विशेष BASH सिंटैक्स असंगत है >&-:

    /your/first/command >&- 2>&-

    आदेश को नोट करने के लिए सावधान रहें: >&- स्टडआउट को बंद कर देता है , जो आप करना चाहते हैं; &>-एक फ़ाइल -(हाइफ़न) नामक फ़ाइल में stdout और stderr को रीडायरेक्ट करता है, जो वह नहीं है जो आप करना चाहते हैं। यह पहली बार में समान दिखाई देगा, लेकिन उत्तरार्द्ध आपकी कार्य निर्देशिका में एक आवारा फ़ाइल बनाता है। यह याद रखना आसान है: >&2डिस्क्रिप्टर 2 (stderr) पर >&3रिडायरेक्ट करता है , डिस्क्रिप्टर 3 के >&-लिए स्टडआउट को रीडायरेक्ट करता है , और डेडआउट को एक डेड एंड पर रीडायरेक्ट करता है (यानी यह स्टडआउट बंद कर देता है)।

    यह भी सावधान रहें कि कुछ कमांड एक बंद फाइल डिस्क्रिप्टर को विशेष रूप से अच्छी तरह से हैंडल नहीं कर सकते हैं ("राइट एरर: बैड फाइल डिस्क्रिप्टर"), जिसके कारण बेहतर समाधान हो सकता है ...

  • आउटपुट को रीडायरेक्ट करता है/dev/null , जो सभी आउटपुट को स्वीकार करता है और इसके साथ कुछ भी नहीं करता है। यह इस तरह दिख रहा है:

    your_command "Hello?" > /dev/null

    किसी फ़ाइल में आउटपुट पुनर्निर्देशन के लिए, आप बहुत ही संक्षिप्त रूप से एक ही स्थान पर stdout और stderr दोनों को निर्देशित कर सकते हैं, लेकिन केवल bash में:

    /your/first/command &> /dev/null

अंत में, एक ही बार में कई आदेशों के लिए ऐसा करने के लिए, घुंघराले ब्रेसिज़ में पूरी चीज़ को घेर लें। बैश इसे कमांड के एक समूह के रूप में मानते हैं , आउटपुट फाइल डिस्क्रिप्टर को एग्रीगेट करते हैं ताकि आप एक ही बार में रीडायरेक्ट कर सकें। यदि आप ( command1; command2; )वाक्यविन्यास का उपयोग कर उपधाराओं के बजाय परिचित हैं , तो आप पाएंगे कि ब्रेसिज़ लगभग बिल्कुल उसी तरह का व्यवहार करते हैं, सिवाय इसके कि जब तक आप उन्हें एक पाइप में शामिल नहीं करते हैं ब्रेसिज़ एक उपधारा नहीं बनाएगा और इस प्रकार आपको अंदर चर सेट करने की अनुमति देगा।

{
  /your/first/command
  /your/second/command
} &> /dev/null

अधिक विवरण, विकल्प और वाक्यविन्यास के लिए पुनर्निर्देशन पर बैश मैनुअल देखें ।


नमस्ते, मुझे पता है कि यह एक पुराना सवाल है लेकिन क्या इसे सशर्त रूप से किया जा सकता है? जैसे मैं कुछ शर्त के तहत आउटपुट छिपाना चाहता हूं? मुझे पता है कि मैं अगर-के तहत उसी हिस्से को दोहरा सकता हूं लेकिन क्या ऐसा करने का एक बेहतर तरीका है?
उस्मा ज़फर

@UsamaZafar मैं एक चर ( "शेल पैरामीटर" ), जिसे आप स्क्रिप्ट में या तो /dev/nullया /dev/stdout(या /path/to/a/logfile) सशर्त रूप से पहले सेट कर रहा हूं , और फिर उस गंतव्य पर पुनर्निर्देशन का उपयोग करके &> $output_dest(या जो भी आप इसे नाम देते हैं) सेट करके करेंगे। यदि आप उस स्थिति में stdout और stderr को संयोजित नहीं करना चाहते हैं, तो आप उन्हें अलग तरह से पुनर्निर्देशित कर सकते हैं > $output_dest 2> $errors_dest
जेफ बोमन

35

आप stdout को / dev / null में रीडायरेक्ट कर सकते हैं।

yum install nano > /dev/null

या आप stdout और stderr दोनों को पुनर्निर्देशित कर सकते हैं,

yum install nano &> /dev/null

लेकिन अगर कार्यक्रम में एक शांत विकल्प है, तो यह बेहतर है।


23

एक प्रक्रिया में आम तौर पर स्क्रीन पर दो आउटपुट होते हैं: stdout (मानक आउट), और stderr (मानक त्रुटि)।

आम तौर पर सूचनात्मक संदेश जाते हैं sdout, और त्रुटियां और अलर्ट जाते हैं stderr

आप कर stdoutके एक कमांड के लिए बंद कर सकते हैं

MyCommand >/dev/null

और stderrऐसा करके बंद करें :

MyCommand 2>/dev/null

यदि आप दोनों बंद चाहते हैं , तो आप कर सकते हैं:

MyCommand 2>&1 >/dev/null

2>&1Stdout रूप में एक ही जगह पर stderr भेज कहते हैं।


8

आप आउटपुट को रीडायरेक्ट कर सकते हैं /dev/null। अधिक जानकारी के लिए / dev / null इस लिंक को पढ़ें ।

आप निम्न तरीकों से एक कॉमैंड के आउटपुट को छिपा सकते हैं:

echo -n "Installing nano ......"; yum install nano > /dev/null; echo " done."; 

मानक आउटपुट को पुनर्निर्देशित करें /dev/null, लेकिन मानक त्रुटि नहीं। यह स्थापना के दौरान होने वाली त्रुटियों को दिखाएगा, उदाहरण के लिए यदि yumपैकेज नहीं मिल रहा है।

echo -n "Installing nano ......"; yum install nano &> /dev/null; echo " done.";

हालांकि यह कोड टर्मिनल में कुछ भी नहीं दिखाएगा क्योंकि मानक त्रुटि और मानक आउटपुट दोनों को पुनर्निर्देशित किया जाता है और इस प्रकार इसे शून्य कर दिया जाता है /dev/null


1
महान शेयर .... दोस्त आप मुझे दिखा सकते हैं कि कमांड के सेट के लिए केवल एक बार एक ही संदेश का उत्पादन कैसे करें
user2650277

5

>/dev/null 2>&1दोनों को म्यूट करेगा stdoutऔरstderr

yum install nano >/dev/null 2>&1

4

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

आप सबसे निश्चित रूप से भी उपयोग करना चाहते हैं -y

echo "Installing nano..."
yum -y -q install nano

यम के सभी विकल्पों को देखने के लिए, उपयोग करें man yum


धन्यवाद, मैंने मान लिया कि यम के पास एक-से-इस्तेमाल किया-अक़्ल है और साथ ही दबाने के लिए भी। मैं जो कर रहा हूं, उसके लिए यह मददगार था।
हाइपरियन

0
.SILENT:

आपकी स्क्रिप्ट की शुरुआत में ".SILENT:" टाइप करें बिना कॉलनों के।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.