এক্সিকিউটড কমান্ড থেকে ত্রুটি বার্তা ক্যাপচার কিভাবে?


20

আমাকে একটি স্বয়ংক্রিয় সার্ভার কঠোর করার স্ক্রিপ্ট তৈরি করার দায়িত্ব দেওয়া হয়েছিল এবং একটি জিনিস যা তাদের প্রয়োজন তা হ'ল প্রতিটি কমান্ডের সমস্ত আউটপুট কার্যকর করা হয়। আমি ত্রুটির বার্তাটি একটি স্ট্রিংয়ের মধ্যে সঞ্চয় করতে এবং এটি একটি পাঠ্য ফাইলে যুক্ত করতে চাই।

ধরা যাক আমি এই আদেশটি চালিয়েছি:

/sbin/modprobe -n -v hfsplus

আমার মেশিনে এটি চালনার আউটপুটটি হ'ল:

FATAL: Module hfsplus not found

আমি কীভাবে কোনও ত্রুটির বার্তাটি স্ট্রিংয়ের মধ্যে সঞ্চয় করতে পারি? কোন সাহায্যের ব্যাপকভাবে প্রশংসা হবে। ধন্যবাদ!


আমি এই কমান্ডটি চালনার চেষ্টা করেছি: var = $ (/ sbin / modprobe -n -v hfsplush) এবং তারপরে এটি প্রদর্শিত হচ্ছে: But 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করে তা নিশ্চিত করুন`


আমি এই পদ্ধতির চেষ্টা করেছি এবং এটি এটি পাঠ্য ফাইলে সরাসরি সংরক্ষণ করে stores আমি এটি প্রথমে কোনও স্ট্রিংয়ের মধ্যে সঞ্চয় করতে চাই যাতে সামগ্রীগুলি সহজেই ফর্ম্যাট করতে পারি।
মিগুয়েল রোক

1
@ মিগুয়েলরোক আপডেটগুলি দেখুন
নেটওয়ার্কার

1
আমি আউটপুটটিকে একটি হারডোকের ভিতরে রাখার চেষ্টা করেছি এবং এটিও কাজ করে। অনেক ধন্যবাদ @ নেট ওয়ার্কার!
মিগুয়েল রোক

1
কেউ আমার সম্পাদনাটিকে উল্টে দিয়েছে, কারণ আমার কাছে একটি "সিনট্যাক্স ত্রুটি & #" ছিল এবং> এর পরে স্থানটি সরিয়ে ফেলেছে। একটি ন্যায়সঙ্গত ভাল লাগত।
পিয়েরে.সাসৌলাস

আমি সম্পাদনা করার চেষ্টা করেছি কারণ: "অপ্রত্যাশিত টোকেনের নিকটে সিনট্যাক্স ত্রুটি
avoid

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
কমান্ড প্রতিস্থাপনের জন্য সর্বদা ব্যাকটিকের পরিবর্তে $ (কমান্ড) ব্যবহার করুন। এটি আরও ভাল :)
শ্রী

আমি জানি এটি আরও ভাল (আমি $ ()) ব্যবহার করে কম সমস্যা পেয়েছি, তবে কেন এটি?
কলোনুক

4

আমি এইভাবে ত্রুটি ক্যাপচার

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

যদি উত্স ব্যর্থ হয় তবে আমি ত্রুটিটি ক্যাপচার করব এবং এটি লগ করব log লগ_ওয়ার্নটি কেবল একটি সহজ কাজ।

বিটিডাব্লু, আমি এটি আমার ডটফাইলে ব্যবহার করি



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