বাশে কখন () বনাম {use ব্যবহার করবেন?


74

আমি বাশ দিয়ে শেল স্ক্রিপ্টিং অধ্যয়ন করছি এবং আমার মধ্যে (...)এবং এর মধ্যে পার্থক্যটি জানতে হবে {...}। স্ক্রিপ্ট লেখার সময় কেউ কীভাবে দুজনের মধ্যে নির্বাচন করতে পারে?


1
দেখুন wiki.bash-hackers.org
Helio

3
আপনি কেবল কমান্ড গ্রুপিংয়ের প্রসঙ্গেই বুঝিয়েছেন?
হিমাইল 14

উত্তর:


87

আপনি যদি কমান্ড তালিকার পার্শ্ব প্রতিক্রিয়াগুলি আপনার বর্তমান শেলকে প্রভাবিত {...}
করতে চান তবে আপনি যদি কোনও পার্শ্ব প্রতিক্রিয়া বাদ দিতে চান তবে ব্যবহার করুন(...)

উদাহরণস্বরূপ, আমি যদি একটি সাবশেল ব্যবহার করতে পারি তবে আমি:

  • পরিবর্তন করতে চান $IFSকয়েকটি কমান্ড জন্য, কিন্তু আমি পরিবর্তন করতে চাই না $IFSবর্তমান শেল জন্য বিশ্বব্যাপী
  • cdকোথাও, তবে আমি $PWDবর্তমান শেলটির জন্য পরিবর্তন করতে চাই না

এটি উল্লেখ করা সার্থক যে বন্ধনীগুলি কোনও ফাংশন সংজ্ঞায় ব্যবহৃত হতে পারে:

  • সাধারণ ব্যবহার: ধনুর্বন্ধনী: ফাংশন বডি বর্তমান শেল মধ্যে সঞ্চালিত; পার্শ্ব-প্রতিক্রিয়া ফাংশন সম্পূর্ণ হওয়ার পরে থেকে যায়

    $ count_tmp() { cd /tmp; files=(*); echo "${#files[@]}"; }
    $ pwd; count_tmp; pwd
    /home/jackman
    11
    /tmp
    $ echo "${#files[@]}"
    11    
    
  • অস্বাভাবিক ব্যবহার: বন্ধনী: ফাংশন বডি একটি সাবশেলে চালিত হয়; পার্শ্ব-প্রতিক্রিয়াগুলি যখন সাব-শেল থেকে প্রস্থান হয় তখন অদৃশ্য হয়ে যায়

    $ cd ; unset files
    $ count_tmp() (cd /tmp; files=(*); echo "${#files[@]}")
    $ pwd; count_tmp; pwd
    /home/jackman
    11
    /home/jackman
    $ echo "${#files[@]}"
    0
    

নথিপত্র


11
শেল বিকাশের বহু বছর পরেও আমি জানতাম না যে আপনি সাবশেলে ফাংশন চালানোর জন্য বন্ধনী ব্যবহার করতে পারেন। বিশ্বব্যাপী নেমস্পেসকে দূষিত করা এড়াতে কী দুর্দান্ত ধারণা!
l0b0

7
localকীওয়ার্ডটি ব্যবহার করা সেই দূষণ পরিষ্কার করতে দীর্ঘতর পথ অতিক্রম করে।
গ্লেন জ্যাকম্যান

2
হ্যাঁ, তবে আপনাকে প্রতিটি ভেরিয়েবল স্থানীয় ঘোষণা করতে হবে এবং এটি কোডকে বিশৃঙ্খলা করে।
l0b0

4
ইঙ্গিত: আপনি পার্শ্ব প্রতিক্রিয়া মুক্ত ফাংশন চাই কিন্তু অস্বাভাবিক ফাংশন ঘোষণা সিনট্যাক্স এড়াতে (যা কোড সম্পাদকদের সচেতন নাও হতে পারে) তাহলে শুধু বরং ঘোষণা চেয়ে ফাংশন কল উপর প্রথম বন্ধনী ব্যবহার করেন:pwd; (count_tmp); pwd;
Juve

2
শেলের সাথে ... foo () (:;) foo () {(:;) এর সমতুল্য; You যদি জিজ্ঞাসা করে তবে এটি এটির প্রতিবেদন করে!
অ্যান্থনি

23

অফিসিয়াল বাশ ডকুমেন্টেশন থেকে :

()

( list )

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

{}

{ list; }

কোঁকড়া ধনুর্বন্ধনীগুলির মধ্যে কমান্ডের একটি তালিকা স্থাপনের ফলে তালিকার বর্তমান শেল প্রসঙ্গে কার্যকর করা যায়। কোনও সাবশেল তৈরি হয় না। সেমিকোলন (বা নিউলাইন) নিম্নলিখিত তালিকাটি প্রয়োজনীয়।


9

'{}' কোডটি বর্তমান থ্রেড / প্রক্রিয়া / পরিবেশে কার্যকর করা হয় এবং পরিবর্তনগুলি সংরক্ষণ করা হয়, আরও সংক্ষেপে বলতে গেলে কোডটি বর্তমান স্কোপে চালিত হয়।
'()' তে কোডটি বাশের একটি পৃথক, শিশু প্রক্রিয়াতে চালিত হয় যা কার্যকর হওয়ার পরে বাতিল করা হয়। এই শিশু প্রক্রিয়াটি প্রায়শই একটি উপ-শেল হিসাবে উল্লেখ করা হয় এবং এটি একটি নতুন, শিশু-জাতীয় সুযোগ হিসাবে বিবেচনা করা যেতে পারে।

উদাহরণ হিসাবে নিম্নলিখিত বিবেচনা করুন ...

 ~ # { test_var=test }
 ~ # echo $test_var
 test
 ~ # ( test_var2=test2 )
 ~ # echo $test_var2

 ~ # 

প্রথম উদাহরণে '{}' দিয়ে ভেরিয়েবলটি '}' বন্ধ হওয়ার পরেও সেট করা আছে, যেখানে '()' উদাহরণ সহ ভেরিয়েবলটি '()' এর আওতার বাইরে সেট করা হয় না।


4

(...)সাব-শেলটিতে কোড চালাতে ব্যবহৃত হয়। বোতামের ব্যবহৃত কোডগুলি {...}একটি সাব-শেলটিতে ব্যবহৃত হবে না।

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