পাইপ (|) এর অগ্রাধিকার এবং ল্যাজিকাল এবং (&&) বাশ


17

অপারেটর অগ্রাধিকার সহ ক্লাসিক দৃশ্যে আপনার মত লাইন রয়েছে:

(cd ~/screenshots/ && ls screenshot* | head -n 5)

আর তুমি যদি এটা পার্স জানিনা ((A && B) | C)বা (A && B | C)...

প্রায় সরকারী ডকুমেন্টেশন পাওয়া এখানে তালিকায় নল তালিকাভুক্ত না তাই আমি কেবল টেবিল চেক করতে পারবে না।

ব্যাশ ছাড়াও, (কেবলমাত্র ক্রিয়াকলাপের ক্রম পরিবর্তন করার জন্য নয় এটি একটি সাবশেল তৈরি করে , তাই আমি 100% নিশ্চিত নই যে এই লাইনগুলি আগের লাইনের সমতুল্য:

((cd ~/screenshots/ && ls screenshot*) | head -n 5)

আরও সাধারণভাবে, কীভাবে বাশ লাইনের এএসটি জানবেন ? পাইথনে আমার একটি ফাংশন রয়েছে যা আমাকে গাছ দেয় যাতে আমি সহজেই অপারেশনের ক্রমটি ডাবল করতে পারি।


1
এটি কেবল এটির |সংযোগকারী যা এইচএইচএস স্টিডিনের সাথে এলএইচএস স্টাডাউটের সাথে মানানসই তা জানতে সাহায্য করতে পারে । সুতরাং যদি cdআপনার উদাহরণের কমান্ডটি ব্যর্থ হয় তবে এটি কোনও আউটপুট প্রেরণ করবে না head, তবে headবাস্তবে এখনও executeকিছুই পার্স করবে না এবং কোনও আউটপুট ফেরত দেবে না।
ডোপঘোতি


1
bashকোনও ইয়্যাক পার্সার ব্যবহার করছে কিছু অ্যাডহক জিনিস নয়; আপনি চালাতে যে মাধ্যমে yacc -vএটা দিতে হবে y.outputএকটা চমৎকার ব্যাকরণ যে অনুষ্ঠান &&এবং ||তালিকা একত্রিত করা, এবং তালিকা অবশেষে পাইপলাইনগুলি আপ করা হয় (এবং বিপরীত); TL; ড; A && B | Cহিসাবে একই A && { B | C; }আশানুরূপ। Bএবং এর মধ্যে মৃত্যুদণ্ড কার্যকর করার কোনও আদেশ অনুমান করবেন না C; পাইপলাইনে কমান্ড সমান্তরালভাবে চালিত হয় ।
মশবী

1
লক্ষ্য করুন যে আপনি যে "প্রায় সরকারী ডকুমেন্টেশন" দেখিয়েছেন তা সম্পূর্ণ অপ্রাসঙ্গিক, কারণ এটি [...]পরীক্ষা এবং $((...))পাটিগণিত মূল্যায়নের অভ্যন্তরে ব্যবহৃত অপারেটরদের সম্পর্কে ; বিশেষত ||এবং &&শেল ল্যাঙ্গুয়েজে কমান্ড তালিকার সাথে যেমন ব্যবহার করা হয়েছে তেমনই প্রাধান্য পেয়েছে C, গাণিতিক মূল্যায়নের ক্ষেত্রে বা অপারেটরগুলির &&তুলনায় (যেখানে আরও শক্ত করে বাঁধাই করা হয় ||)।
মশবি

@ মোসবি, এই নথিতে টেবিলটি কী প্রসঙ্গে প্রযোজ্য তাও জানায় না, সুতরাং এটি সেই অর্থে কার্যকর থেকেও কম বলে মনে হচ্ছে ...
ইলক্কাচু

উত্তর:


21
cd ~/screenshots/ && ls screenshot* | head -n 5

এটি সমান

cd ~/screenshots && { ls screenshot* | head -n 5 ; }

( ধনুর্বন্ধনী গ্রুপটি সাবসেল ছাড়াই একসাথে কমান্ড দেয় )। এর নজির |এভাবে &&এবং এর চেয়ে বেশি (আঁটসাঁট আঁটসাঁট) হয় ||। এটাই,

A && B | C

এবং

A || B | C

সর্বদা মানে কেবল খ এর আউটপুট সি দেওয়া হয় । প্রয়োজনবোধে ছদ্মবেশের জন্য আপনি একক সত্তা হিসাবে একসাথে কমান্ডগুলি ব্যবহার করতে (...)বা { ... ; }যোগ দিতে পারেন:

{ A && B ; } | C
A && { B | C ; } # This is the default, but you might sometimes want to be explicit

আপনি কিছু ভিন্ন কমান্ড ব্যবহার করে এটি পরীক্ষা করে দেখতে পারেন। আপনি যদি চালান

echo hello && echo world | tr a-z A-Z

তাহলে আপনি পাবেন

hello
WORLD

পিছনে: tr a-z A-Zউপরের ক্ষেত্রে এর ইনপুট , এবং আপনি দেখতে পাচ্ছেন যে কেবল echo worldএটির মধ্যে পাইপ দেওয়া হয়েছিল, যখন এটি echo helloনিজের মধ্যে দিয়ে গেছে।


এই হয় সংজ্ঞায়িত শেল ব্যাকরণ : যদিও না ভয়ঙ্কর পরিষ্কারভাবে and_or(জন্য উৎপাদন &&/ ||) এএ আছে সংজ্ঞায়িত করা হয় pipeline, তার শরীরে যখন pipelineমাত্র রয়েছে command, যা নেই ধারণ and_or- শুধুমাত্র complete_commandপ্রকাশনা পৌঁছতে পারে and_or, এবং এটি শুধুমাত্র এ বিদ্যমান ফাংশন এবং লুপের মতো কাঠামোগত কাঠামোর সংস্থাগুলির শীর্ষ স্তরের এবং ভিতরে।

কমান্ডের জন্য একটি পার্স গাছ পেতে আপনি নিজেই সেই ব্যাকরণটি প্রয়োগ করতে পারেন, তবে বাশ নিজেই কিছু সরবরাহ করে না। আমি তাদের এমন কোনও শেল জানি না যা তাদের পার্সিংয়ের জন্য ব্যবহৃত হয় beyond

শেল ব্যাকরণের অনেকগুলি বিশেষ কেস রয়েছে যা কেবলমাত্র আধা-আনুষ্ঠানিকভাবে সংজ্ঞায়িত করা হয় এবং এটি সঠিক হওয়ার পক্ষে একটি মিশন হতে পারে। এমনকি বাশ নিজেও কখনও কখনও এটি ভুল করে ফেলেছে , তাই ব্যবহারিকাগুলি এবং আদর্শ আলাদা হতে পারে।

এমন বাহ্যিক পার্সার রয়েছে যা সিনট্যাক্সের সাথে মেলে এবং একটি গাছ উত্পাদন করার চেষ্টা করে এবং তাদের মধ্যে আমি মোরবিগকে বিস্তৃতভাবে সুপারিশ করব , যা সবচেয়ে নির্ভরযোগ্য হওয়ার চেষ্টা করে।


7

টিএল; ডিআর : তালিকা বিভাজক যেমন ;&, &&এবং ||পার্সিং ক্রম স্থির করুন।

ব্যাশ ম্যানুয়াল আমাদের বলে:

AND এবং OR তালিকা হল && এবং || দ্বারা পৃথক করা এক বা একাধিক পাইপলাইনগুলির ক্রম কন্ট্রোল অপারেটর যথাক্রমে।

বা বাশ হ্যাকারের উইকি কীভাবে সংক্ষেপে এটিকে রেখেছিল

<PIPELINE1> && <PIPELINE2>

সুতরাং, cd ~/screenshots/ && ls screenshot* | head -n 5 এখানে একটি পাইপলাইন রয়েছে - ls screenshot* | head -n 5এবং একটি সাধারণ কমান্ড cd ~/screenshots/। ম্যানুয়াল অনুযায়ী নোট করুন

পাইপলাইনের প্রতিটি কমান্ড পৃথক প্রক্রিয়া হিসাবে (যেমন, একটি সাবসিলে) চালিত হয়।

অন্যদিকে, (cd ~/screenshots/ && ls screenshot*) | head -n 5পৃথক - আপনার একটি পাইপলাইন রয়েছে: বামদিকে সাবশেল এবং ডানদিকে আপনার রয়েছে head -n 5। এই ক্ষেত্রে, ওপির স্বরলিপি ব্যবহার করে এটি হবে(A && B) | C


এর আরেকটি উদাহরণ নেওয়া যাক:

$ echo foo | false &&  echo 123 | tr 2 5
$

এখানে আমাদের একটি তালিকা আছে <pipeline1> && <pipeline2>। যেহেতু আমরা জানি যে পাইপলাইনের প্রস্থান স্থিতি সর্বশেষ কমান্ডের মতো এবং falseনেতিবাচক স্থিতি ওরফে ব্যর্থ হয়, &&ডানদিকে চালিত করবে না।

$ echo foo | true &&  echo 123 | tr 2 5
153

এখানে বাম পাইপলাইনে সাফল্যের প্রস্থান স্থিতি রয়েছে, তাই ডান পাইপলাইনটি কার্যকর করা হয়েছে এবং আমরা এর আউটপুট দেখতে পাচ্ছি।


নোট করুন যে শেল ব্যাকরণ প্রকৃত বাস্তবায়ন আদেশ বোঝায় না। গিলসের একটি উত্তর উদ্ধৃত করতে :

পাইপড কমান্ডগুলি একই সাথে চলমান। আপনি যখন PS চালান গ্রেপ…, এটি পিএস বা গ্রেপ প্রথমে শুরু হয় কিনা এবং কোনও অবস্থাতেই সে চালিয়ে যেতে পারে সে সম্পর্কে এটি ভাগ্যক্রমে (বা কর্নেলের অন্তরে গভীর শিডিয়ুল সূক্ষ্ম সুরকরণের সাথে শেলের ক্রিয়াকলাপের বিশদ সম্পর্কিত)। একযোগে কার্যকর করা।

এবং বাশ ম্যানুয়াল থেকে:

AND এবং OR তালিকাগুলি বাম সাহসিকতার সাথে সম্পাদন করা হয়।

যে উপর ভিত্তি করে , প্রথম মৃত্যুদন্ড কার্যকর করা হবে যদি পূর্ববর্তী কমান্ড সফল, কিন্তু একটি প্রথম প্রক্রিয়া বদলে উত্পন্ন হওয়া হতে পারে যেহেতু তারা একটি পাইপলাইন রয়েছে।cd ~/screenshots/ && ls screenshot* | head -n 5cd ~/screenshots/ls screenshot* | head -n 5head -n 5ls


1
আমি দেখতে পাচ্ছি না যেখানে প্রশ্নটি কোন অর্ডার জিনিসগুলি তৈরি হয়েছে সে সম্পর্কে কিছু জিজ্ঞাসা করে।
মাইকেল হোমার

"এর আগে কোনও ব্যক্তি আগে জন্মায় তার নজির নেই cd ~/screenshots/ && ls screenshot*বা head -n 5" হ্যাঁ, হ্যাঁ, এটিই ঘটেছে ((cd ~/screenshots/ && ls screenshot*) | head -n 5)। তবে এটি দ্ব্যর্থক মামলার বিষয়ে কিছু বলছে না cd ~/screenshots/ && ls screenshot* | head -n 5যা মনে হয় প্রশ্নের মূল বিষয় বলে মনে হচ্ছে (সাথে বা আশেপাশের বন্ধনীর বাইরে)।
ইল্কচাছু

@ilkkachu ঠিক আছে, কিন্তু নিম্নলিখিত বাক্যগুলি এতে স্পর্শ করে। cd ~/screenshots/ && ls screenshot* প্রথমে প্রক্রিয়া করাতে হবে কারণ &&তালিকাগুলি অগ্রাধিকারের ক্রম অনুযায়ী বেশি (কমপক্ষে l0b0 এর উত্তরের ভিত্তিতে)। আপনি উত্তর আমার কোথায় উন্নত করা উচিত বলে মনে করেন?
সের্গেই কোলোডিয়াজনি

@ সার্জি কলোডিএজনি, ঠিক আছে, এই প্রশ্নটি উভয়েরই রয়েছে (cd && ls | head)এবং ((cd && ls) | head), আপনি কোনটি বোঝাতে চাইছেন তা স্পষ্ট করে বলা ভাল।
ইল্কাচ্চু

@ ইল্কাচ্চু ঠিক আছে, আমি আপাতত এটি মুছে ফেলব, এবং এর মধ্যে এটি সম্পাদনা করব
সের্গি কোলোডিয়াজনি

3

এখানে এটি নির্দিষ্ট করা আছে bash(1):

SHELL GRAMMAR
[...]
   Pipelines
       A  pipeline  is  a sequence of one or more commands separated by one of
       the control operators | or |&.
[...]
   Lists
       A list is a sequence of one or more pipelines separated by one  of  the
       operators ;, &, &&, or ||, and optionally terminated by one of ;, &, or
       <newline>.

সুতরাং, &&পাইপলাইন পৃথক।


2

আপনি শুধু চেষ্টা করতে পারেন echo hello && echo world | less। আপনি দেখতে পাচ্ছেন যে |এর চেয়ে বেশি অগ্রাধিকার রয়েছে (কমান্ডের একটি পাইপলাইন একটি কমান্ড)। আপনার দ্বিতীয় উদাহরণের জন্য একই নয় । তবে cdকোনও আউটপুট না থাকায় আপনি কোনও পার্থক্য দেখতে পাবেন না, ইথার ওয়ে।

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