বাশগুলিতে ফাংশনগুলি কি সাব-প্রসেসিস হিসাবে চালিত হয়?


28

ইন অ্যাডভান্সড ব্যাশ-স্ক্রিপ্টিং গাইড , এ উদাহরণস্বরূপ 27-4 , 7 তম নিচ থেকে লাইন, আমি এই পড়েছি:

একটি ফাংশন একটি উপ-প্রক্রিয়া হিসাবে চলে।

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

এই সাইটে অনুসন্ধান, বাশ ম্যান, এবং আমার অনুসন্ধান ইঞ্জিন কোনও আলো এনেছে না।

আপনার কি উত্তর আছে এবং ব্যাখ্যা করতে চান?


12
যেমনটি উল্লেখ করা হয়েছে, সেই গাইডটি চরমভাবে বিভ্রান্ত করছে। আমি পরিবর্তে উওলজ বাশ গাইডের প্রস্তাব দিই
ওয়াইল্ডকার্ড

উত্তর:


36

অ্যাডভান্সড বাশ-স্ক্রিপ্টিং গাইডটি সর্বদা নির্ভরযোগ্য নয় এবং এর উদাহরণ স্ক্রিপ্টগুলিতে কমান্ড প্রতিস্থাপনের জন্য কার্যকরভাবে অবহেলিত ব্যাকটিক্স ব্যবহার করার মতো পুরানো তারিখের অভ্যাস `command`রয়েছে $(command)

এই বিশেষ ক্ষেত্রে এটি সম্পূর্ণরূপে ভুল rect

(ক্যানোনিকাল) বাশ ম্যানুয়ালটিতে শেল ফাংশনগুলির বিভাগটি অবশ্যই এটি উল্লেখ করে

শেল ফাংশন বর্তমান শেল প্রসঙ্গে কার্যকর করা হয়; তাদের ব্যাখ্যা করার জন্য কোনও নতুন প্রক্রিয়া তৈরি হয় না।


10
"অ্যাডভান্সড ব্যাশ-স্ক্রিপ্টিং গাইড সাধারণত অবিশ্বাস্য" খুব সত্য।
1024

1
আপনি কি আপনার প্রথম বাক্যটি সমর্থন করার জন্য রেফারেন্স দিতে পারেন?
ভসডেন

5
@ উইলওউসডেন এখানে একটি রেফারেন্স দেখতে কেমন লাগবে? গাইডের প্রযুক্তিগত ঘাটতির উদাহরণগুলির একগুচ্ছ? এমন একটি দলিল যেখানে বাশ সম্প্রদায়ের বিশেষজ্ঞরা আগে উল্লেখ করেছেন যে এটি বিশ্বাসযোগ্য নয়? বাশ-এ সোনার ব্যাজ সহ স্ট্যাকওভারফ্লো সদস্য যদি কেবল একটি মন্তব্যে রাজি হন তবে এটি কী সহায়তা করবে? : পি
কোজির

3
@ উইলওউসডেন আমি মনে করি না আপনি কী চান তা নির্ভরযোগ্য আকারে উপস্থিত রয়েছে। মেন্ডেল কুপার অতীতে গাইডের সাথে সমস্যাগুলি আপডেট করেছে এবং ঠিক করেছে তবে পাবলিক বাগ ট্র্যাকার বা ত্রুটি-বিচ্যুতির তালিকা নেই। (সম্ভবত এটি আমি সবচেয়ে জঘন্য বিবৃতি দিতে পারি।) সুতরাং আমরা যখন কোনও ত্রুটি খুঁজে পাই (অনুভূত বা বাস্তব) তখন আমরা যা করতে পারি তা লেখককে ইমেল করা এবং সেরাটির জন্য আশা করা hope
কোজিরো

3
@ উইলওউসডেন, ... আপনি যদি ফ্রেইনোড # ব্যাশ চ্যানেলে longকমত্যটি কতদিন ধরে রেখেছেন যে এবিএস এড়িয়ে চলা উচিত, তার ইতিহাস চান , wooledge.org/~greybot/meta/abs দেখুন - প্রতিটি লাইনের দ্বিতীয় ক্ষেত্র টাইমস্ট্যাম্প, এবং প্রথমটি ব্যবহারকারীর নাম; আমি আশাবাদী যাচ্ছি যে প্রশ্নে থাকা ব্যবহারকারী নামগুলি খুব সম্মানিত ব্যক্তিদের পক্ষে যথেষ্ট are
চার্লস ডাফি

32

কোঁকড়া ধনুর্বন্ধনী ফাংশন কলিং শেল প্রক্রিয়াটির মধ্যে চলবে, যদি না তাদের নিজস্ব সাবশেলের প্রয়োজন হয় যা:

  • আপনি যখন তাদের সাথে পটভূমিতে চালাবেন &
  • যখন আপনি একটি পাইপলাইনে লিঙ্ক হিসাবে চালাবেন

পুনর্নির্দেশগুলি বা অতিরিক্ত vভ। ভেরিয়েবলগুলি নতুন সাবশেলকে বাধ্য করবে না:

hw(){
    echo hello world from $BASHPID
    echo var=$var
} 
var=42 hw >&2
echo $BASHPID  #unexports var=42 and restores stdout here

আপনি যদি কারুকার্যগুলির পরিবর্তে প্রথম বন্ধনীর সাথে ফাংশনটি সংজ্ঞায়িত করেন:

hw()(
  echo hello world from $BASHPID
)
hw 
echo $BASHPID

এটি সর্বদা একটি নতুন প্রক্রিয়াতে চলবে।

কমান্ড প্রতিস্থাপন $()সর্বদা বাশে প্রক্রিয়া তৈরি করে (তবে আপনি যদি এর অভ্যন্তরে বিল্টিনগুলি চালান তবে ksh এ নয়)।


আমি জানতাম না f() (...)অনুমোদিত। সেখান থেকে পৃথক্ অন্য কোন সংজ্ঞা হয় {...}এবং (...)? বাশে, আমি এখনও অন্যের মধ্যে নেই।
টমাসজ

1
@tomas আপনি ব্যবহার করতে পারেন function hw { echo hello world; } সিনট্যাক্স (জন্য কোন প্রয়োজন ()যদি আপনি টাইপ functionএবং আপনি সঠিক চূড়ান্ত পর পুনঃনির্দেশগুলি নির্দিষ্ট করতে পারেন }বা )হিসাবে hw(){ echo error; } >&2এটি সম্পর্কে
PSkocik

2
এই উত্তরটি আমি সঙ্গে সঙ্গে ভাবলাম এবং এটি একেবারে সঠিক it এটি সঠিক উত্তর হিসাবে ভোট দেওয়া উচিত। f()(...)সর্বদা একটি নিজস্ব শেল চালানো, যখন f(){...}না।
রেক্সকোটিটানস

11
এনবি বাশ ফাংশনগুলি যে কোনও যৌগিক কমান্ড গ্রহণ করে foo() [[ x = x ]], এটিও একটি কার্যকর বৈধ সংজ্ঞা। তবে, আপনি যদি ফাংশনটির সাথে নজর রাখেন তবে type fooআপনি দেখতে পাবেন যে এটি এখনও সিনট্যাকটিক চিনির জন্য foo() { [[ x = x ]]; }। সাবসেল ফাংশনগুলির ক্ষেত্রেও এটি একই হয়: bar() ( : )হয়ে যায় bar() { ( : ); }
কোজিরো

1
@ কোজিরো সুন্দর +1। এটি জানতেন না
পিএসকোকিক

9

এই উদাহরণ থেকে প্রশ্নে থাকা কমান্ডটি দেখে মনে হচ্ছে:

echo ${arrayZ[@]/%e/$(replacement)}

উদাহরণ পরে বলে:

#    $( ... ) is command substitution.
#    A function runs as a sub-process.

প্রস্তুত ABS গাইড, যা তারা দৃশ্যত লেখার বোঝানো কে দান হচ্ছে ফাংশন একটি ভিতরে রান করে কমান্ড প্রতিকল্পন এবং একটি কমান্ড প্রতিকল্পন রান ভিতরে কমান্ড subshell


এটা খুব বিভ্রান্তিকর। আপনার ব্যাখ্যার জন্য ধন্যবাদ।
টমাসজ

5
@ টমাস "খুব বিভ্রান্তিকর।" হাঁ খুব. এবিএস গাইডের বিপরীতে গ্রেগের উইকি উন্নত বাশ তথ্যের একটি দুর্দান্ত উত্স।
1024

1
চিয়ার্স। এই সম্পর্কে আপনার মতামতটি কী: wiki.bash-hackers.org/start ?
টমাসজ

টমাস @ টমাস সম্পর্কে আমার প্রথম কোনও জ্ঞান নেই।
1024

2
@ টমাস, ... বাশ-হ্যাকার উইকির বিষয়ে আমার নিজের মতামতটি এটি একটি দুর্দান্ত উত্স। আমার কাছে উওলিজ উইকি যেমন ছিল তেমন বিস্তৃত হয়নি তবে এটি নির্ভুল ও সুনির্দিষ্টভাবে লেখা হতে থাকে।
চার্লস ডাফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.