STDERR এর আগে STDOUTs প্রদর্শন করবেন?


9

আমি মারতে নতুন এবং আমি কীভাবে একটি নির্দিষ্ট কমান্ড চালাতে পারি তা আমার জীবনের পক্ষে বুঝতে পারি না, ./fffস্ট্যাডারের আগে নিয়মিত স্টাডআউটগুলি ধরুন এবং মুদ্রণ করুন (আমি নিজের অর্থটি সম্পর্কে বিভ্রান্ত)

উদাহরণ স্বরূপ

$ printf "I am a\ndrill\n" > fff; 
$ cat fff nofile fff nofile fff

I am a
drill
cat: nofile: No such file or directory
I am a
drill
cat: nofile: No such file or directory
I am a
drill

যেমন মুদ্রণ করা প্রয়োজন:

I am a
drill
I am a
drill
I am a
drill
cat: nofile: No such file or directory
cat: nofile: No such file or directory

আমি বুঝতে পারি যে আমার আউটপুটটি প্রথমে একটি ফাইলে পুনর্নির্দেশ করা দরকার এবং তারপরে একই ফাইলটিতে ত্রুটি যুক্ত করা দরকার তবে এটি আমার আউটপুটটি পেয়েছে

$ cat ./foo nofile ./foo nofile ./foo <<< $(touch fin) > see 2>> see 

I am a
drill
I am a
drill
I am a
drill
ectory
cat: nofile: No such file or directory

2
কি catসত্যিই "A" দ্বারা "কিছু" প্রতিস্থাপন করবেন?
দিমিত্রি গ্রিগরিয়েভ

ওহ ডাং আমি হয়ত স্ট্রিং গুলিয়ে ফেলেছি। আমি এখনই এটি সম্পাদনা করব @ দিমিত্রিগ্রিরিভ
আমার

উত্তর:


18

আপনাকে করতে হবে রাখা শেষে প্রদর্শন পাবে যাহাই হউক না কেন দ্বারা stderr আউটপুট কোথাও।

একটি ফাইল মনে আসে:

fff 2> file; cat file >&2

বা মেমরি (এখানে spongeথেকে ব্যবহার করে moreutils):

{ fff 2>&1 >&3 3>&- | sponge >&2 3>&-; } 3>&1
  • {...} 3>&1: {...}ফাইল বর্ণনাকারী (fd) এর মধ্যে 3 টি মূল উত্স হিসাবে একই উত্সকে নির্দেশ করে (যাতে আমরা এটি স্টাডআউটটি পুনরুদ্ধার করতে ব্যবহার করতে পারি fff)।
  • fff <redirs> | sponge <redirs>, fffএবং spongeএকযোগে শুরু হয়েছিল ( <redirs>স্বতন্ত্রভাবে প্রয়োগের সাথে ) fffস্টাইডআউটটি পাইপে গিয়েছিল, এবং spongeস্টিডিনটি পাইপের অন্য প্রান্তে ছিল।
  • 2>&1: stdr এর fd 2 fff1 তে একই জিনিসকে নির্দেশ করে: পাইপটি এই বিন্দুতে, সুতরাং fffত্রুটিটি spongeপাইপটি দিয়ে যায়।
  • >&3: এখন স্ট্যান্ডআউটটি মূল স্টডআউটে পয়েন্টস (এটি যা ছিল তার দিকে ফিরে যেতে)
  • 3>&-: আমরা এফডি 2 বন্ধ করি যার fffদরকার নেই
  • spongeএটি তার ইনপুট সংগ্রহ করে এবং কেবল এটি প্রদর্শন করে (তার স্টাডাউটে যা >&2স্ট্ডার হিসাবে একই উত্সে পুনর্নির্দেশ করা হয়েছে ) এটি তার স্টিডিনে ইওফ সনাক্ত করার পরে (ধরে নেওয়া হয় যে fffএটি সমাপ্ত হবে এবং তার স্টাডআউটটিতে ইতিমধ্যে তার সমস্ত আউটপুট লিখে ফেলেছে)।

যদি spongeইনস্টল না করা থাকে তবে আপনি এটির সাথে প্রতিস্থাপন করতে পারেন perl -0777 -pe ''। সহ -pe '', perlএর ইনপুট থেকে একবারে একটি রেকর্ড পড়ে এবং স্টাডআউটে এটি লেখেন। -0777স্লুর্প মোড যেখানে (কেবলমাত্র সেই ক্ষেত্রে এক) রেকর্ডটি পুরো ইনপুট।


সময় থাকলে দয়া করে এটি ভেঙে দিন!
জর্জ উদোসেন

আমরা কি এর teeপরিবর্তে ব্যবহার করতে পারি sponge...?
জর্জ ভ্যাসিলিউ

@ জর্জিউডোজেন সম্পাদনা দেখুন।
স্টাফেন চেজেলাস

1
@ জর্জেভাসিলিও, teeডেটা ধরে রাখে না, এটি পড়ার সাথে সাথেই এটি লিখে দেয়।
স্টাফেন চেজেলাস

2
@ মিউউ: এটি ঠিক আছে, তবে স্টাফেনের উত্তরটির তৃতীয় লাইন হিসাবে, আপনাকে স্টাডাউট সংরক্ষণ করার দরকার নেই; শুধু কি cat foo nofile foo nofile foo 2> ferr.txt; cat ferr.txt। (এবং আপনি সম্ভবত গেলি ব্যবহার করতে চান >>।) এছাড়াও, Stéphane চমৎকার পয়েন্ট যে আপনি সম্ভবত করতে হবে তোলে cat ferr.txt >&2দ্বারা stderr তথ্য লিখতে করার দ্বারা stderr।
জি-ম্যান বলছেন 'পুনরায় ইনস্টল করুন মনিকা'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.