শেল ফাংশন সংজ্ঞাতে বন্ধনী ses () of এর ব্যবহার কী?


20

একটি ফাংশন হিসাবে সংজ্ঞায়িত করা হয়:

do_something () {
    do it
}

আমি এর নাম 'do_someoming' এবং ক্রিয়াকলাপটি encapsulate করতে কোঁকড়া বন্ধনী বুঝতে পারি, তবে ()এখানে বাশার স্ক্রিপ্টগুলিতে কোনও নামকরণ পরামিতি নেই বলে ধারণাটি পেতে অক্ষম the এটি হিসাবে সংজ্ঞায়িত করা ভাল এবং সোজা হতে পারে

do_something {
  do it
}

যা এটির বর্তমান সিনট্যাক্সের সাথে সাংঘর্ষিক নয় এবং আরও ঘোষণা করে যে কোনও নামকরণকৃত প্যারামিটার নেই। ()এখানে ব্যবহার কি ?


উত্তর:


44

যদি না হয় (), সিনট্যাক্সটি সত্যিই অস্পষ্ট হবে।

একটি ফাংশন সংজ্ঞায়িত করার জন্য কিছু দ্ব্যর্থহীন বাক্য গঠন থাকতে হবে এবং অন্যান্য শেল সিনট্যাক্সকে যথেষ্ট পরিবর্তন না করে এটি এমন হতে পারে না:

do_something {
    # one or more commands go here
}

আপনি বলেছিলেন এটি "এটির বর্তমান সিনট্যাক্স নিয়ে সঙ্কট সৃষ্টি করে না", তবে তা করে! লক্ষ্য করুন যে আপনি যখন এর প্রথম লাইনটি চালানোর চেষ্টা করবেন তখন কোনও ধরণের সিনট্যাক্স ত্রুটি পাবেন না । আপনি একটি ত্রুটি পান, তবে এটি সিনট্যাক্স সম্পর্কে কোনও ত্রুটি নয়। দ্বিতীয় লাইনটি সহ }একটি বাক্য গঠন ত্রুটি, তবে প্রথম লাইনটি এটি নয়। পরিবর্তে, do_something {ডাকা একটি কমান্ড চালানোর চেষ্টা করে do_somethingএবং {সেই আদেশের তর্ক হিসাবে পাস করার চেষ্টা করুন :

$ do_something {
do_something: command not found

যদি ইতিমধ্যে কোনও আদেশ পাওয়া যায় তবে do_somethingআপনি এটি চালাচ্ছেন। যদি ইতিমধ্যে কোনও ফাংশন বলা হয় do_something, আপনি এটি কল করছেন । এটি সাধারণভাবে সিনট্যাক্সটি দ্ব্যর্থহীন হওয়া গুরুত্বপূর্ণ, তবে এটি বিশেষভাবে গুরুত্বপূর্ণ যে এটির পরিবর্তে কোনও ক্রিয়াকলাপ না বলা ছাড়া কোনও ক্রিয়াকে নতুন করে সংজ্ঞা দেওয়া সম্ভব specifically কোনও ফাংশন সংজ্ঞায়িত করা এবং এটি কল করা একই দেখতে পাওয়া উচিত নয়।

শেলটি কীভাবে আচরণ করে {এবং (

হিসাবে type {আপনি বলতে হবে, {একটি শেল কীওয়ার্ড। এটি এটি পছন্দ করে [[। এমন পরিস্থিতিতে ব্যবহার করা হয় যেখানে এটি অন্যথায় কমান্ড হতে পারে, {বিশেষ শব্দার্থক বহন করে। বিশেষত, এটি কমান্ড গ্রুপিং সম্পাদন করে। তবে অন্যান্য পরিস্থিতিতে এটি আক্ষরিক {চরিত্র বোঝাতে অনস্কেপড ব্যবহার করা যেতে পারে । এর মধ্যে এটি কোনও কমান্ডের দ্বিতীয় বা পরবর্তী শব্দ হিসাবে পাস করার পরিস্থিতি অন্তর্ভুক্ত।

অবশ্যই, ব্যাশ পারে চিকিত্সা পরিকল্পিত হয়েছে {ভিন্নভাবে তুলনায় এটি বর্তমানে আছে। তবে, এর সিনট্যাক্সটি আর পসিক্স শেলের সাথে সামঞ্জস্যপূর্ণ হবে না এবং বাশ সত্যই বোর্ন-স্টাইলের শেল হবে না এবং অনেকগুলি শেল স্ক্রিপ্ট চালাতে সক্ষম হবে না।

বিপরীতে, (একটি শেল মেটাচার্যাক্টর। এটা সবসময় বিশেষভাবে চিকিত্সা করা হয় যদি এটি একটি কমান্ড প্রদর্শিত হবে এবং উদ্ধৃত করা হয় না (সঙ্গে ' ', " "অথবা \)। সিনট্যাক্সে এইভাবে কোনও অস্পষ্টতা নেই:

do_something() {
    # one or more commands go here
}

এর অর্থ আর কিছু হতে পারে না। যদি বাশের ফাংশন না থাকে, তবে এটি সিন্ট্যাক্স ত্রুটি হবে, একই কারণে echo foo(bar)একটি সিনট্যাক্স ত্রুটি।

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

পরিশেষে, নোট করুন যে বেশিরভাগ ফাংশন সংজ্ঞা {অনুশীলনে ব্যবহার করার সময় কোনও যৌগিক কমান্ডের অনুমতি দেওয়া হয়। আপনার যদি এমন কোনও ফাংশন থাকে যার দেহটি আপনি সর্বদা সাবশেলে চালাতে চেয়েছিলেন তবে আপনি এটির ( )পরিবর্তে ব্যবহার করতে পারেন { }


1
উচ্চতর স্তরে, এটি মানুষের প্রত্যাশা এবং পঠনযোগ্যতা সম্পর্কে। বেশিরভাগ ভাষায়, বিশেষত সি, ফোরট্রান এবং অন্যান্য সময়ে যখন ব্যাশ স্ক্রিপ্টিং ভাষার বিকাশ ঘটেছিল তখন প্রায়শই একটি ফাংশন / সাব্রোটিনের সর্বদা একটি যুক্তি তালিকা থাকে, সম্ভবত খালি থাকে, যা বন্ধনীতে আবদ্ধ থাকে। সেই দৃষ্টান্তটি পরিবর্তন করুন এবং আপনি ভাষাটি বোঝা আরও শক্ত করে তোলেন।
জামেস্কেফ

15

()টোকেন শেল অনুবাদক বলতে আপনি একটি ফাংশন ঘোষণা করা হয়।

$ do_something () { echo 'do it'; } ; do_something
do it

একটি বিকল্প bashহয়function

function do_something {
 echo 'do it'
}

বা ওয়ান-লাইনার হিসাবে আপনি পরীক্ষা করতে পারেন

$ bash -c "function do_something { echo 'do it'; } ; do_something"
do it

2
functionশব্দ একটি প্রি-POSIX ksh-আইএসএস যে পিছন সামঞ্জস্যের জন্য ব্যাশ সমর্থন করে; তবে বাশ এটিকে খারাপভাবে সমর্থন করে (ভেরিয়েবলগুলি ফাংশন-স্থানীয় ডিফল্ট হিসাবে তৈরি করে না, যেমন পুরানো ksh form আকারে ঘোষিত ফাংশনগুলিতে করে)। ফলস্বরূপ, এটি নতুন কোডের জন্য আদর্শ নয়। Wiki.bash-hackers.org/scriptting/obsolete
চার্লস ডাফি

@ চার্লসডুফি, এই ব্যাখ্যার জন্য ধন্যবাদ :-)
সুডোডাস

1
@ চার্লসডুফি আপনি কি বলছেন যে ksh এবং বাশ এমন কিছু বাক্য গঠন গ্রহণ করে যা ksh এ একটি পরিবর্তনশীল স্থানীয় করে তবে ব্যাশে গ্লোবাল করে তোলে? এটি ঠিক শোনাচ্ছে না। আংশিকভাবে সেই পোস্ট এবং চেকিংয়ের উপর ভিত্তি করে আমার বোঝাপড়া (ksh93-এ), এই যে ksh বাশের চেয়ে কম পরিস্থিতিতে ভেরিয়েবলকে স্থানীয় করে তোলে , এর চেয়ে বেশি কখনও নয়। ব্যাশে, typesetকোনও -gফাংশন ছাড়াই সর্বদা একটি স্থানীয় ভেরিয়েবল ঘোষণা করে। সঙ্গে functionকীওয়ার্ডটি ব্যাশ ও ksh সুযোগ ভেরিয়েবল একই ভাবে , তারা না?
এলিয়াহ কাগান

@ এলিয়াকাগান আমার মনে হয় চার্লস যা উল্লেখ করছেন তা এখানে গিলের উত্তরে প্রদর্শিত হয়েছে
সের্গেই কোলোডিয়াজনি

9

কতটা এক-সত্য-ব্রেস-স্টাইল -আপনি!

অন্যান্য বিবেচনা করুন, পুরোপুরি সূক্ষ্ম ব্রেস শৈলী:

foo
{
  ...
}
foo
  {
    ...
  }
foo
  while ...; do ...; done # Look, ma! No braces!
foo
( ... ) # Look, ma! No braces and a subshell to boot!

শেলটি কীভাবে বলতে পারে যে সেগুলি ফাংশন সংজ্ঞা এবং কেবল fooকমান্ড তালিকাগুলি অনুসারে একটি আদেশ নয় ? এই সমস্ত ক্ষেত্রে, একটি অতিরিক্ত disambiguating ফ্যাক্টর, মত ()বা মূলশব্দ functionপ্রয়োজনীয়।


দ্বিতীয় চিন্তায়, এটি আসলে ওটিবিএস নয়, যেহেতু ওটিবিএস একটি নতুন লাইনে ব্রেসগুলি অনুমতি দেয় এমন এক জায়গাটি ফাংশন সংজ্ঞায়নের জন্য।
মুড়ু

3
আমি মনে করি যে এটি যুক্তিযুক্ত হওয়া উচিত যে আপনি এটিটিকে ওটিবিএস হিসাবে চিহ্নিত করতে ঠিকই ছিলেন, কারণ সি এবং সি ++ এর ফাংশনগুলির বিপরীতে, বোর্ন-স্টাইলের শেল স্ক্রিপ্টের একটি ফাংশন সংজ্ঞাটি অন্য ফাংশন সংজ্ঞাটির শরীরে সরাসরি বাসা বাঁধতে পারে এবং তর্কসাপেক্ষভাবে আলাদা করার যোগ্য নয়। (বা সম্ভবত এটি জাভা প্রোগ্রামিংয়ে জনপ্রিয় স্টাইল যেখানে পদ্ধতিগুলি ওটিবিএসের পরিবর্তে একই লাইনে তাদের উদ্বোধনী ব্রেস পায়)) কোনওভাবেই, সিনট্যাক্সটি কীভাবে ব্রেস প্লেসমেন্টে কঠোর বাধা আরোপ করতে হবে সে সম্পর্কে আপনি একটি দুর্দান্ত বক্তব্য রাখেন ither বিনা ()বা এ জাতীয় কিছু।
এলিয়াহ কাগান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.