বাশ এবং zsh এ && বনামের প্রাধান্য


9

উত্তর এই প্রশ্ন আমি আচরণ মধ্যে একটি খুব মজার (এবং সূক্ষ্ম) পার্থক্য আবিষ্কৃত bashএবং zsh:

ইন bash:

romano@RRyS:~$ pwd
/home/romano
romano@RRyS:~$ alias x="cd /bin && ./echo A >/dev/null  &"
romano@RRyS:~$ x
[1] 16611
romano@RRyS:~$ pwd
/home/romano

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

এতে নেই zsh:

[romano:~] % pwd
/home/romano
[romano:~] % alias x="cd /bin && ./echo A >/dev/null &"
[romano:~] % x
[1] 16744
[1]  + 16744 done       ./echo A >/dev/null                                    
1& [romano:/bin] % pwd
/bin
[romano:/bin] % 

এখানে ডিরেক্টরি পরিবর্তন করা হয়েছে।

দেখে মনে হয় যে এর চেয়ে &ইন bashএর একটি আলাদা অগ্রাধিকার আছে zsh--- আমি বলতে চাইছি, কমান্ডটি পড়তে পারে

(cd /tmp && echo A) & 

ইন bashএবং হিসাবে

cd /tmp && (echo A &) 

মধ্যে zsh। এটি কি সঠিক বা ভিন্ন আচরণের কারণ অন্যটি?

উত্তর:


9

বিভিন্ন, নথিভুক্ত আচরণ zshmisc

একটি তালিকা শূন্য বা তার বেশি sublists, যা প্রতিটি sublist দ্বারা বন্ধ হয় একটি ক্রম ;, &, &|, &!, অথবা একটি newline। এই টার্মিনেটরটি তালিকার শেষ সাবলিস্ট থেকে optionচ্ছিকভাবে বাদ দেওয়া যেতে পারে যখন তালিকাটি ভিতরে (...)বা এর ভিতরে একটি জটিল কমান্ড হিসাবে প্রদর্শিত হবে {...}। যখন একটি সাবলিস্ট ;বা নিউলাইন দ্বারা বন্ধ করা হয় , শেলটি পরবর্তী সাবলিস্টটি কার্যকর করার আগে এটি শেষ হওয়ার জন্য অপেক্ষা করে। একটি sublist একটি দ্বারা সমাপ্ত হয়ে গেলে &, &|অথবা &!, শেল পটভূমিতে এটা গত পাইপলাইন executes, এবং এটি সমাপ্ত হওয়া পর্যন্ত (অন্যান্য শাঁস যা ব্যাকগ্রাউন্ডে পুরো sublist চালানো থেকে পার্থক্য লক্ষ্য করুন) অপেক্ষা করুন নেই। একটি পটভূমি পাইপলাইন শূন্য একটি স্থিতি ফেরত।


3

সমাহিত করা zshmisc(1)নিম্নলিখিত রেখাটি:

যদি কোনও সাবস্টিস্টটি &',& & ', বা `&!' দ্বারা অবসান হয় , শেলটি এটির শেষ পাইপলাইনটি পটভূমিতে কার্যকর করে,

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

$ echo $foo $bar

$ foo=3 && bar=5 && sleep 1 &
$ echo $foo $bar
3 5

বর্তমান শেলতে প্রথম দুটি পাইপলাইন কার্যকর করা হয় এবং এই ধারণাকে সমর্থন করে এবং উপ-তালিকার কেবলমাত্র শেষ পাইপলাইনটি ব্যাকগ্রাউন্ডে আসলে কার্যকর করে।

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