एक कमांड का आउटपुट छुपाना


31

मेरे पास एक स्क्रिप्ट है जहां यह जांचता है कि पैकेज स्थापित है या नहीं और पोर्ट 8080 का उपयोग किसी विशेष प्रक्रिया द्वारा किया जा रहा है या नहीं। मैं बैश के साथ बिल्कुल भी अनुभवी नहीं हूं, इसलिए मैंने ऐसा कुछ किया:

if dpkg -s net-tools; then
    if  netstat -tlpn | grep 8080 | grep java; then
        echo "Shut down server before executing this script"
        exit
    fi
else
    echo "If the server is running please shut it down before continuing with the execution of this script"
fi

# the rest of the script...

हालाँकि, जब स्क्रिप्ट निष्पादित होती है , तो मुझे टर्मिनल में आउटपुट dpkg -s net-toolsऔर netstat -tlpn | grep 8080 | grep javaआउटपुट दोनों मिलते हैं , और मैं नहीं चाहता कि, मैं आउटपुट को कैसे छिपा सकता हूं और सिर्फ ifs के परिणाम के साथ रहना चाहिए ?

इसके अलावा, क्या मैं क्या कर रहा हूँ करने के लिए एक और अधिक सुंदर तरीका है? और क्या यह जानने का एक और अधिक सुंदर तरीका है कि पोर्ट 8080 का उपयोग क्या प्रक्रिया है (न कि यदि इसका उपयोग किया जा रहा है), यदि कोई हो?

जवाबों:


53

आमतौर पर किसी भी कमांड के आउटपुट को छिपाने के लिए stdoutऔर उसे stderrरीडायरेक्ट किया जाता है /dev/null

command > /dev/null 2>&1

स्पष्टीकरण:

1 command > /dev/null.: command(stdout) के आउटपुट को /dev/null
2 पर 2>&1पुनर्निर्देशित stderrकरता है :: पर पुनर्निर्देश करता है stdout, इसलिए त्रुटियां (यदि कोई हैं) भी/dev/null

ध्यान दें

&>/dev/null: दोनों stdoutऔर stderrपर पुनर्निर्देश करता है /dev/null। एक वैकल्पिक के रूप में उपयोग कर सकते हैं/dev/null 2>&1

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

आपके मामले में, आप इसका उपयोग कर सकते हैं,

if dpkg -s net-tools > /dev/null 2>&1; then
    if  netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1; then
    #rest thing
else
    echo "your message"
fi

यहां अगर शर्तों की जाँच की जाएगी जैसा कि पहले था, लेकिन कोई आउटपुट नहीं होगा।

टिप्पणी का उत्तर दें :

netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1: यह grep javaदूसरे पाइप के बाद से उठाए गए आउटपुट को रीडायरेक्ट कर रहा है । लेकिन आपको जो संदेश मिल रहा है netstat -tlpn। समाधान का उपयोग दूसरा ifहै,

if  [[ `netstat -tlpn | grep 8080 | grep java` ]] &>/dev/null; then

1
तुम भी उल्लेख कर सकते हैं grep -q, और नए के &> ...लिए एक पर्यायवाची के रूप में मार> ... 2>&1
Steeldriver

धन्यवाद, कि स्क्रिप्ट पटकथा। लेकिन मुझे अभी भी एक संदेश मिल रहा है कि कुछ प्रक्रियाओं को नहीं दिखाया जा सकता है क्योंकि इसे रूट के रूप में निष्पादित नहीं किया जा रहा है। इसके साथ होता है netstat। क्या कोई रास्ता है जो मैं भी छिपा सकता हूं?
दाबाबा

1

lsof -i :<portnumnber> आप क्या चाहते हैं की तर्ज पर कुछ करने में सक्षम होना चाहिए।


क्षमा करें, मैं इस पोस्ट में वास्तविक प्रश्न जोड़ना भूल गया, इसे एग्जीन करें क्योंकि आप उत्तर केवल "माध्यमिक" प्रश्नों के लिए दे रहे हैं
dabadaba

वहाँ भी मैं जिस तरह से मैं उस आदेश के उत्पादन से प्रक्रिया का नाम / पीआईडी ​​निकाल सकता है?
दादाबा

ऐसा ही करने का एक और तरीका है fuser -n tcp 8080, जिसका आउटपुट पार्स करना आसान हो सकता है।
fkraiem

0

आउटपुट को फ्लश करने के /dev/nullलिए शायद सबसे आसान तरीका है, कभी-कभी /dev/nullफ़ाइल अनुमतियाँ सेट की जाती हैं ताकि गैर-रूट वहां आउटपुट को फ्लश न कर सकें। तो, ऐसा करने का एक और गैर-रूट तरीका है

command | grep -m 1 -o "abc" | grep -o "123"

यह डबल- grepसेटअप abcउनके साथ मिलान लाइनों को ढूंढता है और -oसेट होने के बाद से केवल abcमुद्रित होता है और केवल एक बार ही होता है -m 1। फिर आउटपुट जो या तो खाली होता है या फिर abcgrep में भेजा जाता है जो स्ट्रिंग के केवल उन हिस्सों को ढूंढता है जो मेल खाते हैं 123और अंतिम कमांड के बाद से केवल abcखाली स्ट्रिंग आउटपुट होता है। उम्मीद है की वो मदद करदे!

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