শেলের মধ্যে একটি ফাংশন রফতানি করা হচ্ছে


87

দয়া করে আমাকে বলুন কীভাবে প্যারেন্ট শেল (বাশ, শ বা কেএসএইচ) তে কোনও ফাংশন রফতানি করতে হবে যাতে ফাংশনটি প্যারেন্ট প্রসেস থেকে শুরু হওয়া সমস্ত শিশু প্রক্রিয়ার জন্য উপলব্ধ থাকে?


উত্তর:


106

export -fবৈশিষ্ট্য ব্যাশ নির্দিষ্ট হল:

পিতামাতা

#!/bin/bash
plus1 () { echo $(($1 + 1)); }
echo $(plus1 8)
export -f plus1
./child 14 21

শিশু

#!/bin/bash
echo $(plus1 $(($1 * $2)) )

4
রফতানি করা ফাংশনটি কি কেবলমাত্র শিশু কলের জন্য উপলব্ধ? এটি বর্তমান বাশ সেশনে কীভাবে প্রয়োগ করবেন?
.brcrc

4
@vp_arth: চাইল্ড কলগুলিতে আপনার যদি ফাংশনটির প্রয়োজন না হয় তবে আপনার এটি রফতানি করার দরকার নেই। এটি বর্তমান অধিবেশনে যে কোনও উপায়ে উপলভ্য রয়েছে (দ্রষ্টব্য যে এটি যদি কোনও ফাইলে সংজ্ঞায়িত করা হয় তবে বর্তমান সেশনে এটি উপলব্ধ করার জন্য আপনার ফাইলটি চালনার পরিবর্তে আপনার উত্সটি তৈরি করতে হবে)।
ডেনিস উইলিয়ামসন


3

আপনি যদি ksh বা zsh ব্যবহার করছেন:

আপনি পরিবেশের পরিবর্তনশীল ব্যবহার করতে পারেন FPATH, যাতে আপনি আপনার সমস্ত ফাংশন রাখতে পারেন।

যদি FPATHইন্টারেক্টিভ ইন্টারপ্রেটারে সেট করা থাকে এবং বর্তমান শেল এনভায়রনমেন্ট বা এর মধ্যে একটি কমান্ড বা ফাংশন না পাওয়া যায় PATH, তবে তালিকাভুক্ত ডিরেক্টরিগুলি অনুপস্থিত কমান্ডের নাম অনুসারে একটি ফাইলের অস্তিত্ব অনুসন্ধান করবে। যদি এটির সন্ধান পাওয়া যায় তবে এটি বর্তমান শেল পরিবেশে উত্সাহিত হয় এবং এটি ফাংশনটি সংজ্ঞায়িত করার প্রত্যাশা করে।

সুতরাং, আপনি আপনার সমস্ত ফাংশন কোনও স্থানে রাখতে পারেন FPATHএবং শিশু স্ক্রিপ্টগুলিও এটি সন্ধান করতে সক্ষম হবে।

autoloadআপনার প্রয়োজনীয় ফাংশনগুলি লোড করতে আপনি শেল স্ক্রিপ্টগুলিতে কমান্ডটি ব্যবহার করতে পারেন :

autoload fun_a fun_b

Zsh এ, autoloadকাজ করার জন্য প্রয়োজনীয় FPATH ইন kshও তার নিকট আত্মীয়, আমি বিশ্বাস করি এটি সহজভাবে সংজ্ঞায়িত ফাংশন ঘটায় FPATH, আপনার পাথ নিয়মিত কমান্ড ওভাররাইড করতে তারা যদি সরাসরি সংজ্ঞায়িত করবে।

কিছু বিবরণ FPATHএবং autoload:


1

যদি আপনি এর সাথে সাবসেল তৈরি করেন ( )তবে সেগুলি সমস্ত সংজ্ঞা, পরামিতি এবং শেল ভেরিয়েবলগুলির একটি স্ন্যাপশটের উত্তরাধিকারী হবে।

আপনি যদি প্রোগ্রামগুলির মতো এগুলি চালনা করেন তবে আপনি সংজ্ঞাগুলি এতে রাখতে পারেন .bashrc

আপনি যদি কোনও PATH কমান্ডের জন্য মোড়ক বা প্রতিস্থাপনের জন্য কোনও বিদ্যমান স্ক্রিপ্টকে ফাঁকি দেওয়ার চেষ্টা করছেন, তবে .bashrcমৃত্যুদন্ডের বিবরণের উপর নির্ভর করে কাজ করবে। যদি তা না হয় তবে আপনি একটি মোড়ক স্ক্রিপ্ট সম্পাদন করতে পারেন যা কেবল একটি .বা sourceএকটি অন্তর্ভুক্ত ফাইল করে যা ফাংশনগুলি সংজ্ঞায়িত করে এবং তারপরে শেল স্ক্রিপ্টের পরিবর্তে কমান্ডগুলির পরিবর্তে একই কাজ করে।

মোড়ক স্ক্রিপ্টটি এর মতো দেখতে পারে:

script=$1
shift
. include.sh
. $script "$@"

ধারণাটি হ'ল প্রথম প্যারামিটারটি আসল স্ক্রিপ্টের নাম এবং বাকী প্যারামিটারগুলি অর্গস হয়, তারপরে উপরের স্ক্রিপ্টটি চালানো হয়।


4
আপনি দয়া করে কিছু কোডিং উদাহরণ দিয়ে এগুলি ব্যাখ্যা করতে পারেন। আমি
বাশার্কে

1
declare -x -f NAME

অধিক তথ্য

- কর্মের নাম এবং সংজ্ঞাগুলিতে ক্রিয়া বা প্রদর্শনকে সীমাবদ্ধ করুন
NAME এক্সপোর্ট করতে এক্স

6
দয়া করে মনে রাখবেন যে এটি নির্দিষ্টbash । ( ksh'র প্রতিরূপের আয়ত্তে declare, typeset, একটি হয়েছে -xবিকল্প, কিন্তু এটি শুধুমাত্র প্রযোজ্য ভেরিয়েবল না ফাংশন; জন্য Ditto zsh)।
mklement0

0

কার্যগুলি প্রকৃতির দ্বারা রফতানিযোগ্য নয়। তবে আপনি স্ট্রিং রফতানি করতে পারেন, তাই আমার এখানে একটু কৌশল আছে:

func="$(typeset -f funcname)"
export func

ফাংশনটি আমদানি করতে, রফতানি স্ট্রিং থেকে এটি পুনরায় সংজ্ঞায়িত করুন:

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