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