আমি বাশ দিয়ে শেল স্ক্রিপ্টিং অধ্যয়ন করছি এবং আমার মধ্যে (...)
এবং এর মধ্যে পার্থক্যটি জানতে হবে {...}
। স্ক্রিপ্ট লেখার সময় কেউ কীভাবে দুজনের মধ্যে নির্বাচন করতে পারে?
আমি বাশ দিয়ে শেল স্ক্রিপ্টিং অধ্যয়ন করছি এবং আমার মধ্যে (...)
এবং এর মধ্যে পার্থক্যটি জানতে হবে {...}
। স্ক্রিপ্ট লেখার সময় কেউ কীভাবে দুজনের মধ্যে নির্বাচন করতে পারে?
উত্তর:
আপনি যদি কমান্ড তালিকার পার্শ্ব প্রতিক্রিয়াগুলি আপনার বর্তমান শেলকে প্রভাবিত {...}
করতে চান তবে আপনি যদি কোনও পার্শ্ব প্রতিক্রিয়া বাদ দিতে চান তবে ব্যবহার করুন(...)
উদাহরণস্বরূপ, আমি যদি একটি সাবশেল ব্যবহার করতে পারি তবে আমি:
$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
local
কীওয়ার্ডটি ব্যবহার করা সেই দূষণ পরিষ্কার করতে দীর্ঘতর পথ অতিক্রম করে।
pwd; (count_tmp); pwd;
অফিসিয়াল বাশ ডকুমেন্টেশন থেকে :
()
( list )
বন্ধনীগুলির মধ্যে কমান্ডের একটি তালিকা স্থাপনের ফলে একটি সাব-শেল পরিবেশ তৈরি হবে এবং তালিকার প্রতিটি কমান্ড সেই সাবশেলে সম্পাদিত হবে। যেহেতু তালিকাটি সাব-শেলের মধ্যে কার্যকর করা হয়েছে, ভেরিয়েবল অ্যাসাইনমেন্টগুলি সাব-শেল সম্পূর্ণ হওয়ার পরে কার্যকর হয় না।
{}
{ list; }
কোঁকড়া ধনুর্বন্ধনীগুলির মধ্যে কমান্ডের একটি তালিকা স্থাপনের ফলে তালিকার বর্তমান শেল প্রসঙ্গে কার্যকর করা যায়। কোনও সাবশেল তৈরি হয় না। সেমিকোলন (বা নিউলাইন) নিম্নলিখিত তালিকাটি প্রয়োজনীয়।
'{}' কোডটি বর্তমান থ্রেড / প্রক্রিয়া / পরিবেশে কার্যকর করা হয় এবং পরিবর্তনগুলি সংরক্ষণ করা হয়, আরও সংক্ষেপে বলতে গেলে কোডটি বর্তমান স্কোপে চালিত হয়।
'()' তে কোডটি বাশের একটি পৃথক, শিশু প্রক্রিয়াতে চালিত হয় যা কার্যকর হওয়ার পরে বাতিল করা হয়। এই শিশু প্রক্রিয়াটি প্রায়শই একটি উপ-শেল হিসাবে উল্লেখ করা হয় এবং এটি একটি নতুন, শিশু-জাতীয় সুযোগ হিসাবে বিবেচনা করা যেতে পারে।
উদাহরণ হিসাবে নিম্নলিখিত বিবেচনা করুন ...
~ # { test_var=test }
~ # echo $test_var
test
~ # ( test_var2=test2 )
~ # echo $test_var2
~ #
প্রথম উদাহরণে '{}' দিয়ে ভেরিয়েবলটি '}' বন্ধ হওয়ার পরেও সেট করা আছে, যেখানে '()' উদাহরণ সহ ভেরিয়েবলটি '()' এর আওতার বাইরে সেট করা হয় না।
(...)
সাব-শেলটিতে কোড চালাতে ব্যবহৃত হয়। বোতামের ব্যবহৃত কোডগুলি {...}
একটি সাব-শেলটিতে ব্যবহৃত হবে না।