ব্যাশ সহ, আমি কীভাবে অন্য একটি প্রক্রিয়াতে স্ট্যান্ডার্ড ত্রুটি পাইপ করব?


137

প্রক্রিয়াটির স্ট্যান্ডার্ড আউটপুটটিকে অন্য প্রক্রিয়াগুলির স্ট্যান্ডার্ড ইনপুটটিতে কীভাবে পাইপ করা যায় তা এটি সুপরিচিত:

proc1 | proc2

তবে আমি যদি প্রো 1 এর প্রমিত ত্রুটিটি প্রো 2 তে প্রেরণ করতে চাই এবং মানক আউটপুটটিকে তার বর্তমান অবস্থানে ছেড়ে যেতে চাই? আপনি মনে করেন bashযে এর লাইন বরাবর একটি কমান্ড থাকবে:

proc1 2| proc2

কিন্তু, হায়, না। এই কাজ করতে কোন উপায় আছে কি?


আপনি এ জাতীয় সরল পুনঃনির্দেশটি করতে পারেন rcযা অন্য শেল। উদাহরণ: proc1 |[2] proc2। ভাল লাগছে না? না bashযদিও।
— রল্ফ

উত্তর:


168

রয়েছে প্রক্রিয়া প্রতিকল্পন । যা একটি ফাইলের জন্য একটি প্রক্রিয়া বিকল্প করে তোলে।
আপনি stderrনিম্নলিখিত হিসাবে একটি ফাইল পাঠাতে পারেন :

process1 2> file

তবে আপনি নিম্নলিখিত হিসাবে ফাইলের জন্য একটি প্রক্রিয়া প্রতিস্থাপন করতে পারেন:

process1 2> >(process2)

এখানে একটি কংক্রিট উদাহরণ যা stderrপর্দা উভয়কে প্রেরণ করে এবং একটি লগফাইলে সংযোজন করে

sh myscript 2> >(tee -a errlog)

23
এটি সঠিকভাবে বর্ণিত প্রশ্নের উত্তর দেয় এবং @ প্যাক্সডিয়াব্লো
— মিমলিব

আমি এই চেষ্টা করেছিলাম। এটা তোলে কাজ (না weston --help 2> >(less)), এবং এটা আমার শেল কপর্দকশূন্য, আমি থেকে প্রস্থান করুন এবং পুনরায় লগ-ইন করতে হয়েছিল।
— রল্ফ

1
@Rolf উভয় weston --helpএবং lessকীবোর্ড মিথষ্ক্রিয়া আছে কিন্তু শুধুমাত্র তাদের মধ্যে 1 তা গ্রহণ করে আশা করছি, তাহলে আপনি একটি বিশ্রী অবস্থা হতে পারে। grepপরিবর্তে কিছু দিয়ে পরীক্ষা করার চেষ্টা করুন । এছাড়াও আপনি দেখতে পাবেন যে মাউস / কীবোর্ড উভয়ই ইনপুট ওয়েস্টন না করে যেভাবেই 2 য় কমান্ডে চলেছে।
— বিউওলফনোড 42

88

আপনি নীচের কৌশলটি অদলবদল করতে stdout এবং stderr। তারপরে আপনি কেবল নিয়মিত পাইপ কার্যকারিতা ব্যবহার করুন।

( proc1 3>&1 1>&2- 2>&3- ) | proc2

সরবরাহ করা stdoutএবংstderr উভয়ই শুরুতে একই জায়গায় নির্দেশিত, এটি আপনাকে যা প্রয়োজন তা দেবে।

কি x>yবিট করে ফাইল হ্যান্ডেল পরিবর্তন হয় xএটা এখন যেখানে ফাইলকে পরিচালনা করতে তার তথ্য পাঠায়, যাতে yবর্তমানে পয়েন্ট। আমাদের নির্দিষ্ট ক্ষেত্রে:

  • 3>&1একটি নতুন হ্যান্ডেল তৈরি করে 3যা বর্তমান হ্যান্ডেলের আউটপুট আসবে 1(মূল স্ট্ডআউট), কেবলমাত্র এটি নীচের চূড়ান্ত বুলেট পয়েন্টের জন্য কোথাও সংরক্ষণ করতে।
  • 1>&2বর্তমান হ্যান্ডেল (মূল stderr) এ 1আউটপুট হ্যান্ডেল (stdout) পরিবর্তন করে ।2
  • 2>&3-বর্তমান হ্যান্ডেল 2আউটপুট হ্যান্ডেল (stderr) পরিবর্তন করে (মূল স্টাডআউট) তারপরে হ্যান্ডেলটি বন্ধ করে ( শেষে দিয়ে)।33-

এটি কার্যকরভাবে অ্যালগরিদম বাছাই করার জন্য স্বপ কমান্ডটি দেখতে পাবেন:

temp   = value1;
value1 = value2;
value2 = temp;

3
1>&2-এখানে বিচার করার চেয়ে মূল্য কী 1>&2? আমরা কেন fd বন্ধ করতে চাই তা আমি বুঝতে পারি না 2, যদি আমরা কেবল এটি পুনরায় খুলতে / তাত্ক্ষণিকভাবে পুনরায় নিয়োগ দিতে যাচ্ছি।
— dubiousjim

1
@ সন্দেহজনক জিম, এই বিশেষ ক্ষেত্রে কোনও লাভ নেই, আমার সন্দেহ হয় যে আমি এটি কেবল সামঞ্জস্যপূর্ণভাবেই করতে পেরেছি - ফাইল হ্যান্ডেল 3 বন্ধ করে দেওয়া এটি মুক্ত করার পক্ষে একটি ভাল ধারণা।
— paxdiablo

ভাল পয়েন্ট, @ ওভোগোলোভিন, আমি যে সম্পাদনাটি করেছি তার পরে সাত মাসের মধ্যে কেউ এই বিষয়টি গ্রহণ করতে বিশ্বাস করতে পারে না। আপনার পরামর্শ অনুযায়ী স্থির।
— প্যাক্সিডিয়াবলো

এই "(3> & 1 1> & 2- 2> & 3-) | কম-আর" যেখানে "(এলএসএল 3> & 1 1> & 2-) এর সাথে কাজ করার জন্য জিসিসির মেক (যা আমার সিস্টেমে বর্ণযুক্ত) পাওয়ার চেষ্টা করছে 2> & 3-) | কম-আর "প্রত্যাশা অনুযায়ী কাজ করে।
— unsynchronized

দেখে মনে হচ্ছে আপনার দুটি ব্যাখ্যা দুটি দ্বিতীয় পুনর্নির্দেশের জন্য ফিরে এসেছে। 1> & 2- 1 (অরিজিনাল স্ট্ডআউট) হ্যান্ডেল করতে ফাইল হ্যান্ডেল 2 (মূল স্ট্ডার) সেট করে 2> & 3- 2 (মূল স্ট্যাডার) হ্যান্ডেল করতে ফাইল হ্যান্ডেল 3 (অনুলিপি স্টডআউট) সেট করে। আমি ভুল থাকলে দয়া করে আমাকে সংশোধন করুন। বিটিডব্লু, আমি অনুমান করব যে 2-এ ড্যাশ হ'ল নতুন স্টাডার ডেটা এই বাফারটিতে পাঠানো থেকে আটকাতে হবে যখন এটি স্টাডাউট থেকে ডেটা দিয়ে জনবহুল হচ্ছে।
— অগস্মিথ

70

বাশ 4 এর এই বৈশিষ্ট্যটি রয়েছে:

যদি `| & 'ব্যবহার করা হয়, কমান্ড 1 এর স্ট্যান্ডার্ড ত্রুটি পাইপটির মাধ্যমে কমান্ড 2 এর স্ট্যান্ডার্ড ইনপুটটির সাথে সংযুক্ত; এটি 2> & 1 | এর জন্য সংক্ষিপ্ত স্ট্যান্ডার্ড ত্রুটির এই অন্তর্নিহিত পুনর্নির্দেশ কমান্ড দ্বারা নির্দিষ্ট কোনও পুনর্নির্দেশের পরে সঞ্চালিত হয়।

zsh এরও এই বৈশিষ্ট্য রয়েছে।

-

অন্যান্য / পুরানো শেলগুলির সাথে, কেবল এটি স্পষ্টভাবে লিখুন

ফার্স্টকম্যান্ড 2> & 1 | OtherCommand


14
দস্তাবেজগুলি পড়া থেকে, এটি স্ট্যান্ডারের বিপরীতে স্ট্যান্ডার্ড ত্রুটি এবং আউটপুট উভয়ই করে তবে এটি জেনে রাখা ভাল। বাশ 4 এ খুঁজছেন শুরু করার সময়, আমার মনে হয়।
— প্যাক্সডিয়াবল্লো

বর্তমান বাশ ম্যানুয়ালটিতে "যদি | & ব্যবহৃত হয় তবে কমান্ডের স্ট্যান্ডার্ড ত্রুটিটি এর স্ট্যান্ডার্ড আউটপুট ছাড়াও কমান্ড 2 এর স্ট্যান্ডার্ড ইনপুটটির সাথে সংযুক্ত রয়েছে" reads এটি ওপি যা চায় তা স্পষ্টভাবে নয়।
— পিটার - মনিকা

@ পিটারএ.স্নাইডার: ওপি বলেছে "স্ট্যান্ডার্ড আউটপুটটিকে তার বর্তমান অবস্থানে যেতে দিন" যা অস্পষ্ট হতে পারে।
— পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

আমি কোনও অস্পষ্টতা দেখতে ব্যর্থ হই। আপনার পরামর্শ (1) দুটি স্রোতকে সংযুক্ত করে। (২) সম্মিলিত তথ্য কোথাও, সম্ভবত অন্য কোথাও OtherCommandলিখেছেন । সুতরাং এটি একই ডেটা নয়, এবং এটি সম্ভবত অন্য কোথাও চলছে। ওপি'র ইচ্ছের বিপরীত কথা, তাই না?
— পিটার - মনিকা

@ পিটারএ.স্নাইডার: স্ট্যান্ডার্ড আউটপুটটির বর্তমান অবস্থান আর কোথায়? যদি স্টডআউট এবং স্টেডারর proc1আউটপুট হয় এবং আপনি proc2স্ট্যাডারকে স্ট্যান্ডিনে যেতে চান (যা সেখানে প্রো 1 এর স্টাডাউট যাচ্ছে), তবে আমার উত্তরটি এটি সম্পাদন করে। ওপি যা চেয়েছিল তা আমি দিয়েছিলাম , সম্ভবত সে যা চেয়েছিল তা নয় । এতে সম্ভাব্য অস্পষ্টতা রয়েছে। ওপি উত্তর যা গৃহীত অদলবদল stdout- এ এবং দ্বারা stderr যা না কি তিনি চেয়েছেন।
— পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

27

সমস্যা সমাধানের সাথে সাথে অদলবদল দুর্দান্ত। আপনার যদি মূল স্টডআউটের প্রয়োজন না হয় তবে আপনি এটি এইভাবে করতে পারেন:

proc1 2>&1 1>/dev/null | proc2

আদেশ জরুরী; আপনি চান না:

proc1 >/dev/null 2>&1 | proc1

এটি সবকিছুতে পুনর্নির্দেশ করবে /dev/null !


0

এগুলির কোনওটিই খুব ভালভাবে কাজ করেনি। আমি যা খুঁজে পেয়েছি তার সেরা উপায়টি আপনি যা চান তা করুন:

(command < input > output) 2>&1 | less

এটি কেবলমাত্র সেই ক্ষেত্রে কাজ commandকরে যেখানে কীবোর্ড ইনপুট প্রয়োজন হয় না। উদাহরণ:

(gzip -d < file.gz > file) 2>&1 | less

gzip ত্রুটি কম মধ্যে রাখবে

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