निष्पादित कमांड से त्रुटि संदेश कैसे प्राप्त करें?


20

मुझे एक स्वचालित सर्वर सख्त करने वाली स्क्रिप्ट बनाने का काम सौंपा गया था और एक चीज जो उन्हें चाहिए थी वह है प्रत्येक कमांड के सभी आउटपुट की रिपोर्ट। मैं एक स्ट्रिंग के अंदर त्रुटि संदेश संग्रहीत करना चाहता हूं और इसे एक पाठ फ़ाइल में जोड़ना चाहता हूं।

मान लें कि मैंने यह आदेश चलाया:

/sbin/modprobe -n -v hfsplus

मेरी मशीन में इसे चलाने का आउटपुट होगा:

FATAL: Module hfsplus not found

मैं उस त्रुटि संदेश को स्ट्रिंग के अंदर कैसे संग्रहीत कर सकता हूं? किसी भी तरह की सहायता का स्वागत किया जाएगा। धन्यवाद!


मैंने इस कमांड को चलाने की कोशिश की: var = $ (/ sbin / modprobe -n -v hfsplush) और फिर इसे प्रदर्शित करना: $ var लेकिन यह अभी भी स्ट्रिंग के अंदर त्रुटि संदेश को कैप्चर नहीं करता है।
मिगुएल रोक

जवाबों:


23

आप इसे त्रुटियों को पुनर्निर्देशित करके कर सकते हैं:

/sbin/modprobe -n -v hfsplus 2> fileName 

एक स्क्रिप्ट के रूप में

#!/bin/bash
errormessage=$( /sbin/modprobe -n -v hfsplus 2>&1)
echo $errormessage

या

 #!/bin/bash
errormessage=`/sbin/modprobe -n -v hfsplus 2>&1 `
echo $errormessage

यदि आप >>इसके बजाय त्रुटि उपयोग को जोड़ना चाहते हैं>

अप्रत्याशित टोकन के पास "सिंटैक्स त्रुटि" त्रुटि से बचने के लिए उपयोग करें 2>&1और न 2> &1करें


मैंने उस दृष्टिकोण की कोशिश की है और यह पाठ फ़ाइल में इसे संग्रहीत करता है। मैं चाहता हूं कि पहले इसे एक स्ट्रिंग के अंदर संग्रहीत किया जाए ताकि मैं सामग्री को आसानी से प्रारूपित कर सकूं।
मिगुएल रोक

1
@MiguelRoque अपडेट देखें
Networker

1
मैंने एक HEREDOC के अंदर आउटपुट डालने की कोशिश की और यह काम भी कर गया। बहुत बहुत धन्यवाद @ नेटवर्क!
मिगुएल रोक

1
किसी ने मेरे द्वारा किए गए संपादन को वापस कर दिया, क्योंकि मेरे पास "सिंटैक्स त्रुटि थी" और> के बाद स्थान हटा दिया। एक औचित्य अच्छा होता।
पियरे.ससौलस

मैंने संपादित करने का प्रयास किया क्योंकि: त्रुटि से बचने के लिए 2> और 1 और 2> और 1 का उपयोग करना सुनिश्चित करें "अप्रत्याशित टोकन के पास सिंटैक्स
त्रुटि`

15

बस बैश स्क्रिप्ट में एक स्ट्रिंग के रूप में संग्रहीत करने के लिए:

X=`/sbin/modprobe -n -v hfsplus 2>&1`
echo $X

यह थोड़ा बेहतर हो सकता है क्योंकि आप संदेशों को देखेंगे जब कमांड निष्पादित होती है:

TMP=$(mktemp)
/sbin/modprobe -n -v hfsplus 2>&1 | tee $TMP
OUTPUT=$(cat $TMP)
echo $OUTPUT
rm $TMP

1
कमांड प्रतिस्थापन के लिए हमेशा backticks के बजाय $ (कमांड) का उपयोग करें। यह बेहतर है :)
श्री

मुझे पता है कि यह बेहतर है (मुझे $ () का उपयोग करके कम समस्याएं हैं), लेकिन ऐसा क्यों है?
कोलोनुकु

4

मैं इस तरह से त्रुटि पकड़ता हूं

. ${file} 2>&1 | {
  read -d "\0" -t 0.01 error
    [ -z "$error" ] || log_warn Load completion ${file} failed: "\n${error}"
}

यदि स्रोत विफल हुआ, तो मैं त्रुटि को पकड़ लूंगा और लॉग कर दूंगा ।log_warn एक सरल कार्य है।

BTW, मैं अपने dotfiles में इस का उपयोग करें


2

एक फ़ाइल का उपयोग करने के लिए संलग्न करने के लिए /sbin/modprobe -n -v hfsplus 2>> filename


2

नए बैश संस्करण (यानी 4.1+ बैश):

$ msg=$(ls -la nofile 2>&1)
$ echo $msg
ls: cannot access nofile: No such file or directory
$ 

0

एक चर में त्रुटि संदेश वापस करने के लिए, बस;

error=$(/sbin/modprobe -n -v hfsplus 2>&1 1>/dev/null)

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