পাইপ বি থেকে ডি? - এন্ড অ্যান্ড বি || সি | ডি


14

কমান্ড কাঠামোটি আবার লেখার কোনও উপায় আছে A && B || C | Dযাতে বি বা সি হয় ডি-তে পাইপ হয়?

বর্তমান কমান্ডের সাহায্যে কেবল বি বা সি এবং ডি উভয়ই চালিত হয়।

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

এখানে চিত্র বর্ণনা লিখুন

উত্তর:


31

হ্যাঁ, ব্যাশে আপনি প্রথম বন্ধনী ব্যবহার করতে পারেন:

(A && B || C) | D

এইভাবে আউটপুটটি A && B || Cপাইপ করা হবে D


6
অথবা A && (B || C) | D, আপনি যদি বি, সি, বা ডি চালাতে চান না তবে এ ব্যর্থ হয়
zwol

2
আপনি এখানে sh
পেরেন

কোঁকড়া ধনুর্বন্ধনী বদলে বন্ধনী ব্যবহার করা একটি ইচ্ছাকৃত সিদ্ধান্ত ছিল কিনা তা স্পষ্ট নয় (যদি তা হয় তবে কী কী সুবিধা হবে?) বা কেবল একটি পর্যবেক্ষণ। আপনি ব্যাখ্যা করতে পারেন?
টম ফেঞ্চ

@ টমফেনেক পেরেনগুলি একটি সাব-শেলতে এই অভিব্যক্তিটি চালিত করার কারণ, যা স্ক্রিপ্টের বাকী অংশের পিওভি থেকে একটি (একক) পৃথক প্রক্রিয়া। সুতরাং, প্যারেন্সের ভিতরে এক্সপ্রেশনটির আউটপুট যাই হোক না কেন, এটি একসাথে পাইপ করা হবে। (যেহেতু AA
সাবশেলের অভ্যন্তরে

1
@jpaugh আমি মনে করি বিচ্ছিন্নতা সম্পর্কে আপনার বক্তব্যটি একটি ভাল তবে কোঁকড়া ধনুর্বন্ধনী ব্যবহার করার সময় আউটপুটটি একইভাবে পাইপ করা হবে, তাই না?
টম ফেনেক

14

আপনি এটি হিসাবে লিখতে পারেন

if A; then B; else C; fi | D

আপনি বলছেন যে আপনি রান করতে চান Bবা C, কিন্তু A && B || Cতা অর্জন করেন না। যদি Aসফল হয়, তবে Bরান এবং ব্যর্থ হয় তবে তা কার্যকর হবে C

দ্রষ্টব্য 1: আপনি যদি কোনওভাবে গ্যারান্টি দিতে পারেন যে Bসর্বদা সফল হয় এবং একটি সংক্ষিপ্ত সংস্করণ দিয়ে আঁকতে চান, তবে আমি এখনও বেছে নিই

{ A && B || C; } | D

ওভার ( ... ), আধুনিক অকারণে বাহিনী একটি নতুন subshell তৈরি করা, যা দূরে অপ্টিমাইজ করা পারে অথবা হতে পারে পান।

নোট 2: উভয় ফর্ম অনুমান Aকরে কোনও আউটপুট তৈরি হয় না, যা আপনার উদাহরণে সত্য তবে সাধারণভাবে অগত্যা নয়। যা এড়ানো যায়

A; if [ "$?" -eq 0 ]; then B; else C; fi | D

আপনি কি নিশ্চিত যে { … }পাইপের কারণে সাবসেল তৈরি করতে বাধ্য করে না? আমি নিম্নলিখিত আচরণ পালন: pgrep bashএবং pgrep bash | catএবং if true; then pgrep bash; fiএবং { pgrep bash; }আউটপুট এক লাইন আছে; ( pgrep bash; )এবং ( pgrep bash; ) | catএবং { pgrep bash; } | catএবং if true; then pgrep bash; fi | catআউটপুট দুই লাইন আছে।
wchargin

@wchargin ... | ...একটি সাবস্কেল তৈরি করার কারণ ঘটায়, এটি অনিবার্য। ( ... )কমপক্ষে তত্ত্বের ভিত্তিতে একটি অতিরিক্ত সাবশেল তৈরি হতে পারে যা { ...; }এড়ানো যায়, তবে এটিই আমি বলতে চেয়েছি "সম্ভবত অপটিমাইজড হতে পারে বা নাও হতে পারে": সম্ভবত যে এই বিশেষ ক্ষেত্রে শেলটি বুঝতে পারে যে এটি কোনও ব্যাপার নয়, প্রভাব একই হবে।
hvd

5

গ্রহণকারীর উত্তর সঠিক তবে এটির ইনপুট হিসাবে আউটপুট না পাওয়ার সম্ভাব্য ব্যবহারের ক্ষেত্রে এটি আবরণ করে না । এটি অর্জন করতে আপনার প্রয়োজনের উপর নির্ভর করে আপনার একটি স্ট্রিম পুনঃনির্দেশের প্রয়োজন।ADA

  • আপনি যদি Aযাইহোক আউটপুট বাতিল করতে চান :

    { A >/dev/null && B || C; } | D
  • আপনি যদি Aটার্মিনালে আউটপুট দেখতে চান :

    { A >/dev/tty && B || C; } | D
  • Aপরবর্তী কমান্ডের ইনপুট হিসাবে আপনার যদি আউটপুট প্রয়োজন হয় তবে আপনার Eএকটি অতিরিক্ত কমান্ড গ্রুপ এবং স্ট্রিম পুনঃনির্দেশ প্রয়োজন:

    { { A >&3 && B || C; } | D; } 3>&1 | E

যদি এগুলি আপনার কাছে খুব তীব্র লাগে (যেমন এটি আমার কাছে হয়) তবে আমি আপনাকে সুপারিশ করি যে আপনি প্রস্থানের স্থিতির জন্য বিশেষ শেল ভেরিয়েবলটি ব্যবহার করুন এবং এটির Aসাথে কাজ করুন:

A
if [ $? -eq 0 ]; then
  B
else
  C
fi |
D

আপনি যদি আরও সংক্ষিপ্ত হতে চান তবে খুব বেশি আরকেন না হন তবে আমি এটি প্রস্তাব করি:

A; { [ $? -eq 0 ] && B || C; } | D

( এইচডিডির উত্তরের শেষ অংশটিও দেখুন যা আমি আমার আসল উত্তরটি লেখার সময় লক্ষ্য করি নি))


আমার উত্তর যে কভার করে না। আমি আমার "নোট 2:" তে কী রেখেছি দেখুন, যেখানে আমি কেবল Aপাইপলাইন থেকে সরে এসেছি।
এইচডিভি

@ এইচভিডি: আপনি সঠিক আছেন এবং আমাকে আপনার উত্তরের সেই অংশটি দেখানোর জন্য ধন্যবাদ! আমি আমার দাবি পরিবর্তন করেছিলাম এবং সেই অনুসারে আপনাকে ক্রেডিট দিয়েছিলাম।
ডেভিড ফোস্টারস্টার 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.