কমান্ড কাঠামোটি আবার লেখার কোনও উপায় আছে A && B || C | Dযাতে বি বা সি হয় ডি-তে পাইপ হয়?
বর্তমান কমান্ডের সাহায্যে কেবল বি বা সি এবং ডি উভয়ই চালিত হয়।
উদাহরণ স্বরূপ:
কমান্ড কাঠামোটি আবার লেখার কোনও উপায় আছে A && B || C | Dযাতে বি বা সি হয় ডি-তে পাইপ হয়?
বর্তমান কমান্ডের সাহায্যে কেবল বি বা সি এবং ডি উভয়ই চালিত হয়।
উদাহরণ স্বরূপ:
উত্তর:
হ্যাঁ, ব্যাশে আপনি প্রথম বন্ধনী ব্যবহার করতে পারেন:
(A && B || C) | D
এইভাবে আউটপুটটি A && B || Cপাইপ করা হবে D।
sh
AA
আপনি এটি হিসাবে লিখতে পারেন
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আউটপুট দুই লাইন আছে।
... | ...একটি সাবস্কেল তৈরি করার কারণ ঘটায়, এটি অনিবার্য। ( ... )কমপক্ষে তত্ত্বের ভিত্তিতে একটি অতিরিক্ত সাবশেল তৈরি হতে পারে যা { ...; }এড়ানো যায়, তবে এটিই আমি বলতে চেয়েছি "সম্ভবত অপটিমাইজড হতে পারে বা নাও হতে পারে": সম্ভবত যে এই বিশেষ ক্ষেত্রে শেলটি বুঝতে পারে যে এটি কোনও ব্যাপার নয়, প্রভাব একই হবে।
গ্রহণকারীর উত্তর সঠিক তবে এটির ইনপুট হিসাবে আউটপুট না পাওয়ার সম্ভাব্য ব্যবহারের ক্ষেত্রে এটি আবরণ করে না । এটি অর্জন করতে আপনার প্রয়োজনের উপর নির্ভর করে আপনার একটি স্ট্রিম পুনঃনির্দেশের প্রয়োজন।ADA
আপনি যদি Aযাইহোক আউটপুট বাতিল করতে চান :
{ A >/dev/null && B || C; } | Dআপনি যদি Aটার্মিনালে আউটপুট দেখতে চান :
{ A >/dev/tty && B || C; } | DAপরবর্তী কমান্ডের ইনপুট হিসাবে আপনার যদি আউটপুট প্রয়োজন হয় তবে আপনার 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
( এইচডিডির উত্তরের শেষ অংশটিও দেখুন যা আমি আমার আসল উত্তরটি লেখার সময় লক্ষ্য করি নি))
Aপাইপলাইন থেকে সরে এসেছি।
A && (B || C) | D, আপনি যদি বি, সি, বা ডি চালাতে চান না তবে এ ব্যর্থ হয়