বাশ স্ক্রিপ্টে stderr বার্তা দমন


48

নিম্নলিখিত (সামান্য নিরীহ) স্ক্রিপ্ট নাম 'test1.sh' বিবেচনা করুন:

#/bin/bash
#
sleep 10 &
echo sleep pid = $!
pkill sleep

আমি যখন এটি চালনা করি, আমি কেবল প্রতিধ্বনির আউটপুটই পাই না, তবে স্ট্যাডারে ঘুমের মৃত্যুর বিষয়ে বাশের রিপোর্ট:

$ ./test1.sh
sleep pid = 3551
./test1.sh: line 5:  3551 Terminated              sleep 10

এই ক্ষেত্রে, আমি স্টার্ডার থেকে প্রিন্টআউটটি দমন করতে চাই। আমি জানি যে আমি কমান্ড লাইনে এটি করতে পারি:

$ ./test1.sh 2> /dev/null

... তবে স্ক্রিপ্টের মধ্যে থেকে এটিকে দমন করার কোনও উপায় আছে কি? (আমি জানি আমি এটি দ্বিতীয় স্ক্রিপ্টে মুড়িয়ে রাখতে পারি এবং মোড়কে এটি পুনঃনির্দেশিত করতে পারি, তবে আরও কিছু সহজ হতে হবে ...)


আপনি কি পিকিল ঘুমের পরে পুনর্নির্দেশ 2> / dev / নাল যুক্ত করার চেষ্টা করেছিলেন?
রাহুল

@ রহুল: হ্যাঁ আমি করেছিলাম - পকিল বার্তা উত্পন্ন করছে না, বাশ is
fearless_fool

আমি পিকেলের পরিবর্তে কিল ব্যবহার করেছি এবং স্টাডারটি পাই না। আজব ..
রাহুল

@ রহুল: এটি কি কোনও বিল্ট ইন বনাম অ-বিল্ট ইন জিনিস হতে পারে? আপনি কি পিকিল দিয়ে এটি চেষ্টা করেছিলেন?
fearless_fool

হ্যাঁ, আমি বিশ্বাস করি is আমি পিকেলে একই ত্রুটি পেয়েছি, তবে কিল দিয়ে নয়। কিল ব্যবহার করার সময়, আমি প্রোকের নামের পরিবর্তে পিড ব্যবহার করেছি।
রাহুল

উত্তর:


72

তুমি ঠিক বলছো; pkill বার্তা উত্পন্ন করছে না, বাশ হল। আপনি যে পরামর্শ

$ ./test1.sh 2> /dev/null

একটি সম্ভাব্য সমাধান। ইউভিভি যেমন উল্লেখ করেছে, স্ক্রিপ্টের মধ্যে থেকে সমমানের ক্রিয়া

exec 2> /dev/null

এটি স্ক্রিপ্টের জন্য স্ট্যান্ডারটিকে /dev/null এই বিবৃতি থেকে পুনরায় পরিবর্তন না করা পর্যন্ত পুনর্নির্দেশ করে । এটিকে ফিরিয়ে দেওয়ার আনাড়ি পদ্ধতিগুলির মধ্যে রয়েছে

exec 2> /dev/tty

যা স্টাডারকে টার্মিনালে পুনঃনির্দেশ করে। এটি সম্ভবত (তবে প্রয়োজনীয় নয়) যেখানে এটি মূলত ছিল।

অথবা

exec 2>&1

যা স্টার্ডারকে স্টডআউটের সমান হিসাবে সেট করে এবং সম্ভবত ভুল হতে পারে।

আরও নির্ভরযোগ্য উপায়

এক্সিকিউট 3> & 2
এক্সিকিউটিভ 2> / দেব / নাল
(আপনি যেখানে স্টাডার দেখতে চান না সেখানে স্টাফ করুন)) 
এক্সিকিউটিভ 2> & 3

যা ফাইলের বর্ণনাকারী 3 এ মূল স্টাডারকে সংরক্ষণ করে এবং পরে এটি পুনরুদ্ধার করে।

প্রক্রিয়া মৃত্যুর শুধু ঘোষণা দমন করার অন্যান্য উপায় অন্তর্ভুক্ত

(sleep 10 & pkill sleep) 2> /dev/null

এবং

{ sleep 10 & pkill sleep;} 2> /dev/null

যা কেবল দলবদ্ধ কমান্ডের জন্য স্ট্যাডারকে পরিবর্তন করে।


এটি একটি দুর্দান্ত, বিস্তারিত উত্তর। ধন্যবাদ জনাব!
কেইনান লরেন্স

আসল বর্ণনাকারী প্রেরণ করে এবং সেগুলি পুনরুদ্ধার করে নতুন ফাইল বর্ণনাকারীদের সংরক্ষণ stdinএবং এর সাথে সম্পর্কিত কোনও বিপদ আছে কি? stderr/dev/null
আলেকজ মাগুরা

ঠিক আছে, আমি অনুমান করি যে, আপনি যদি এমন কোনও প্রোগ্রাম চালান যা (আপনার অজানা) বিবরণী 3 (বা 4) ফাইল করার জন্য লিখেছিল, তবে সাধারণ পরিস্থিতিতে পরিস্থিতিতে এই অপারেশন ব্যর্থ হবে। তবে প্রোগ্রামটি ব্যর্থতা উপেক্ষা করার জন্য এবং এটি রিপোর্ট না করেই চালিত হতে পারে; তাহলে আপনি কখনই জানতে পারবেন না তবে যদি আপনার ফাইল বর্ণনাকারী 1 (বা 2) ফাইল বর্ণনাকারী 3 (বা 4) এ "পার্ক" করা থাকে, তবে সেই প্রোগ্রামটি হঠাৎ আপনার স্ক্রিপ্টের স্টাডাউট বা স্ট্ডারকে লেখা হবে। তবে এটি একটি খুব স্বতন্ত্র উদাহরণ এবং এখনও ন্যূনতম বিপদ। আপনার মনে কিছু ছিল?
স্কট

1
এফডাব্লুআইডাব্লু, আমি স্কটের গ্রুপযুক্ত কমান্ড পদ্ধতির পক্ষে, অর্থাৎ{ sleep 10 & pkill sleep;} 2> /dev/null
নির্ভীক_ফুল

9

মতে এই আপনি নিম্নলিখিত ভালো কিছু করতে পারে:

#!/bin/bash
exec 2>/dev/null
ls -al test
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.