एक चर में कमांड (उदाहरण के लिए) से आउटपुट को कैसे बचाया जाए


21

मैं परीक्षण करना चाहता हूं कि क्या कोई आउटपुट है diff(परीक्षण यदि फाइलें समान हैं), यदि कोई नहीं है echo "Passed $x" else echo "Failed $x"। मैं कुछ इंटरमीडिएट स्टेप के साथ आया था (आउटपुट को फ़ाइल से अलग करें और फिर फ़ाइल से पढ़ें)

diff "./helloworld$x.out" "./output/helloworld$x.out" > tmp.txt;
output="`cat tmp.txt`";

if [ "$output" = "" ];
  then
    echo "Passed $x";
  else
    echo "Failed $x";
  fi;

मुझे यकीन है कि कोड में सुधार किया जा सकता है? मुख्य सवाल यह है कि क्या आउटपुट को diffसीधे वेरिएबल में सेव करना संभव है ?

जवाबों:


18

यह काम:

अगर अंतर "./helloworld$x.out" "./output/helloworld$x.out"> / dev / null; फिर
    इको "पास $ x";
अन्य
    इको "विफल $ x";
फाई

यदि आप एक चर का उपयोग करते हैं तो इसके बजाय echoआप elseब्रांच को छोड़ सकते हैं : चर को झूठे से पहले सेट करें ifऔर कोड की 2 पंक्तियों को सहेजें।

यदि आप वास्तव में परिणाम को एक चर उपयोग में लाना चाहते हैं:

some_var="$(diff "./helloworld$x.out" "./output/helloworld$x.out")"

यह देखने के लिए कि क्या वास्तव में काम करता है, यह देखने के लिए मेरा परीक्षण शामिल है:

rinzwind @ discworld: ~ $ स्पर्श 1
rinzwind @ discworld: ~ $ टच 2
rinzwind @ discworld: ~ $ अधिक परीक्षण
अगर 1 2> / देव / अशक्त है; फिर
    इको "पास $ x";
अन्य
    इको "विफल $ x";
फाई
rinzwind @ डिस्कवर्ल्ड: ~ $ ./est
बीतने के 

rinzwind @ discworld: ~ $ vi 2
rinzwind @ discworld: ~ $ अधिक 2
2
rinzwind @ डिस्कवर्ल्ड: ~ $ ./est
अनुत्तीर्ण होना 

की >/dev/nullओर से: >/dev/null 2>&1आउटपुट को भेजेगा >/dev/nullऔर इस कमांड के सामने 2>&1 एक ही फाइल ( &1'प्रथम पैरामीटर का उपयोग करें') के लिए मानक त्रुटियां भेजेगा (इसलिए यह भी उपयोग करता है /dev/null)।

सिडेनोट: sdiffसाइड-बाय-साइड diffलिस्टिंग दिखाएंगे :

एसडीएफ 1 2 
1 1
२ २
३ ३
४ ४
५ ५
7 7
                                  > 8
९ ९
१० १०

धन्यवाद यह काम करता है, लेकिन मैं नहीं समझता कि ... > /dev/nullइस संदर्भ में क्या होता है। Diff का आउटपुट गोटो / देव / null होगा, लेकिन कुछ भी नहीं है?
जीवी मेंग

1
अंतर आपकी स्क्रीन पर फ़ाइलों के बीच सभी अंतरों को आउटपुट करेगा और> / dev / null यह सुनिश्चित करता है कि कमांड का आउटपुट गुमनामी में रीडायरेक्ट किया गया है। अगर अभी भी आउटपुट के आधार पर निष्पादित किया जाता है।
रिंज़विंड

1
यदि कथन अलग कमांड के निकास कोड की जाँच करता है। 0 का मतलब है कि कोई अंतर नहीं पाया गया, जबकि 1 का मतलब एक या अधिक अंतर थे।
नॉट एल्डहुइट

17

diff यहां तक ​​कि नीचे दिए गए कोड का उपयोग करके "फ़ाइलें / बिन / बैश और / बिन / श अलग" संदेश को छोड़कर पूरी तरह से आउटपुट को दबा सकते हैं।

file1="./helloworld$x.out"
file2="./output/helloworld$x.out"

if diff -q "$file1" "$file2"; then
    echo "Passed $x"
else
    echo "Failed $x"
fi

यदि आप भी उस संदेश को छिपाना चाहते हैं, तो आपको > /dev/nullआउटपुट के छिपाने के लिए अलग कमांड के बाद अप्लाई करना होगा diff:

if diff -q "$file1" "$file2" >/dev/null; then

/dev/null एक विशेष फ़ाइल है जो ब्लैकहोल के रूप में कार्य करती है, यदि आप इसे लिखते हैं, तो यह चली जाएगी, यदि आप इसे पढ़ रहे हैं, तो आपको कुछ भी वापस नहीं मिलेगा।

ध्यान दें कि बैश ;को लाइनों को समाप्त करने की आवश्यकता नहीं है ।

मूल प्रश्न के लिए, प्रोग्राम के आउटपुट को एक चर में सहेजने के लिए:

file1="./helloworld$x.out"
file2="./output/helloworld$x.out"
output="$(diff -q "$file1" "$file2")"

# the quotes are mandatory, this checks whether $output is empty or not
if [ -n "$output" ]; then
    echo "Passed $x"
else
    echo "Failed $x"
fi

एक चर खाली है या नहीं, यह जांचने के वैकल्पिक तरीके:

[ "$output" = "" ]
[ "$output" == "" ]
[[ "$output" == "" ]]
[[ $output == "" ]]

यदि आप बैश का उपयोग कर रहे हैं, तो पिछले दो कमांड स्ट्रिंग तुलना के लिए अनुशंसित हैं। अन्यथा, पहला और [ -n "$output" ]अनुशंसित है।


6

a) कमांड 1 के आउटपुट को पकड़ा जा सकता है

output=$(diff "helloworld$x.out" "output/helloworld$x.out") 

या बैकटिक्स के साथ, लेकिन वे हतोत्साहित हैं, क्योंकि आप उन्हें घोंसला नहीं दे सकते हैं, और वे फ़ॉन्ट के आधार पर एपोस्ट्रोफ से अलग करना मुश्किल हो सकता है:

 output=`cmd1`

ख) किसी फ़ाइल पर लिखने के बजाय, और फिर उस फ़ाइल को पढ़ना, (या आउटपुट को हथियाना, और फिर उसे प्रतिध्वनित करना) आप सीधे एक पाइप का उपयोग करेंगे:

 cmd1 > file
 cat file | cmd2 

 output=$(cmd1)
 echo "${output}" | cmd2 

=>

 cmd1 | cmd2 

लेकिन आपके उदाहरण में, आपको आउटपुट में कोई दिलचस्पी नहीं है, लेकिन कार्यक्रम के परिणाम - क्या यह काम करता है?

 diff "helloworld$x.out" "output/helloworld$x.out" && echo "success" || echo "failure" 

&& और के उपयोग के बारे में पढ़ने के लिए || "शॉर्टकट और शॉर्टकट OR" की खोज करें।

आउटपुट को साफ रखने के लिए, आप 'diff' के आउटपुट को कहीं और रीडायरेक्ट कर सकते हैं:

 diff "helloworld$x.out" "output/helloworld$x.out" >/dev/null && echo "success" || echo "failure" 

सफलता को हथियाने और बाद में इसका मूल्यांकन करने के लिए, आप $ में एक चर में अंतिम कमांड के परिणाम को स्टोर करते हैं ?:

diff "helloworld$x.out" "output/helloworld$x.out" >/dev/null
result=$?
# do something else
case $result in 
   0) echo success ;;
   *) echo failure ;;
esac

3

यदि आप यह जानना चाहते हैं कि क्या दो फाइलें समान हैं या भिन्न हैं (लेकिन फर्क नहीं पड़ता कि वास्तव में क्या अंतर है), cmpअधिक उपयुक्त है।

if cmp -s file1 file2; then echo "Equal"; else echo "Not equal"; fi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.