কমান্ড থেকে আউটপুট কীভাবে সংরক্ষণ করা যায় (যেমন। পৃথক) একটি ভেরিয়েবলে


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

এইটা কাজ করে:

যদি পৃথক হয় "। তারপর
    প্রতিধ্বনি "পাস করা $ x";
আর
    প্রতিধ্বনি "ব্যর্থ $ x";
ফাই

আপনি পরিবর্তে কোনও ভেরিয়েবল ব্যবহার echoকরলে elseব্রাঞ্চটি ফেলে দিতে পারেন : ভেরিয়েবলটিকে মিথ্যাতে সেট করুন ifএবং কোডের 2 টি লাইন সংরক্ষণ করুন।

যদি আপনি ফলাফলটি পরিবর্তনশীল ব্যবহারের মধ্যে রাখতে চান তবে:

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

এটি আসলে কাজ করে কিনা তা দেখার জন্য আমার পরীক্ষা সহ:

rinzwind @ discworld: $ $ স্পর্শ 1
rinzwind @ discworld: $ $ টাচ 2
rinzwind @ discworld: test $ আরও পরীক্ষা
যদি ডিফার্ট 1 2> / dev / নাল; তারপর
    প্রতিধ্বনি "পাস করা $ x";
আর
    প্রতিধ্বনি "ব্যর্থ $ x";
ফাই
রিনজুইন্ড @ ডিস্কওয়ার্ল্ড: ~ $। / টেস্ট
গৃহীত 

rinzwind @ discworld: ~ $ vi 2
rinzwind @ discworld: ~ আরও 2
2
রিনজুইন্ড @ ডিস্কওয়ার্ল্ড: ~ $। / টেস্ট
ব্যর্থ 

উপর >/dev/nullঅংশ: >/dev/null 2>&1আউটপুট পাঠাব >/dev/nullএবং 2>&1 একই ফাইল (থেকে মান ত্রুটি পাঠাব &1এই কমান্ড সামনে মানে 'ব্যবহার প্রথম প্যারামিটার') (এটা তেমনি ব্যবহার /dev/null)।

সিডনোট: sdiffপাশাপাশি-পাশাপাশি diffতালিকা প্রদর্শন করবে :

sdiff 1 2 
1 1
2 2
3 3
4 4
5 5
7 7
                                  > 8
9 9
10 10

ধন্যবাদ এটি কার্যকর, তবে আমি বুঝতে পারি না যে ... > /dev/nullএই প্রসঙ্গে কী করে। ডিফের আউটপুট গোটো / ডেভ / নাল হবে তবে কিছুই না?
জিউ মেনগ

1
আপনার স্ক্রীন এবং> / dev / null ফাইলগুলির মধ্যে সমস্ত পার্থক্য আউটপুট দেবে এবং কমান্ডের আউটপুটটি বিস্মৃত হওয়ার দিকে পুনরুদ্ধার করা যায় তা নিশ্চিত করে। যদি এখনও আউটপুট উপর ভিত্তি করে কার্যকর করা হয়।
রিনজুইন্ড

1
If স্টেটমেন্টটি পৃথক কমান্ডের প্রস্থান কোডটি পরীক্ষা করে। 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

ক) কমান্ড 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 "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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.