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


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.