উত্তর:
export
সাব-প্রসেসের ক্ষেত্রে ভেরিয়েবলকে উপলব্ধ করে তোলে।
এটাই,
export name=value
এর অর্থ হল যে শেল প্রক্রিয়াটি থেকে আপনি চালিত যে কোনও প্রক্রিয়ার জন্য চলক নামটি উপলব্ধ । আপনি যদি এই ভেরিয়েবলটি ব্যবহার করার জন্য কোনও প্রক্রিয়া চান তবে export
শেলটি থেকে প্রক্রিয়াটি ব্যবহার করুন এবং চালান।
name=value
এর অর্থ হল ভেরিয়েবল স্কোপটি শেলের মধ্যে সীমাবদ্ধ, এবং অন্য কোনও প্রক্রিয়াতে এটি উপলভ্য নয়। আপনি এটি লুপ ভেরিয়েবল, অস্থায়ী ভেরিয়েবল ইত্যাদির জন্য ব্যবহার করবেন
এটি উল্লেখ করা গুরুত্বপূর্ণ যে কোনও ভেরিয়েবল রফতানি এটি প্যারেন্ট প্রসেসগুলিতে উপলব্ধ করে না। অর্থাত্, কোনও প্রবর্তিত প্রক্রিয়াতে একটি ভেরিয়েবল নির্দিষ্ট করা এবং রফতানি করা প্রবর্তনকারী প্রক্রিয়াটিতে এটি উপলব্ধ করে না।
name=value command
নেই পরিবর্তনশীল উপ-প্রক্রিয়ায় প্রাপ্তিসাধ্য না command
।
অন্যরা উত্তর দিয়েছে যে রফতানি পরিবর্তনশীলগুলিকে সাব-শেলের জন্য উপলব্ধ করে এবং এটি সঠিক তবে কেবল একটি পার্শ্ব প্রতিক্রিয়া। আপনি যখন কোনও ভেরিয়েবল রফতানি করেন, এটি বর্তমান শেলের পরিবেশে (যেমন শেল কল putenv(3)
বা setenv(3)
) সেই পরিবর্তনশীলটিকে রাখে ।
প্রক্রিয়াটির পরিবেশ নির্বাহের মাধ্যমে উত্তরাধিকার সূত্রে প্রাপ্ত হয়, সাব-শেলের মধ্যে পরিবর্তনশীলকে দৃশ্যমান করে তোলে।
সম্পাদনা (5 বছরের দৃষ্টিকোণ সহ): এটি একটি নির্বোধ উত্তর। 'রফতানির' উদ্দেশ্য হ'ল ভেরিয়েবলগুলি "পরবর্তী সময়ে কার্যকর করা কমান্ডগুলির পরিবেশে থাকা", সেগুলি কমান্ডগুলি সাব-শেল বা সাবপ্রসেসিস কিনা। একটি নিষ্পাপ বাস্তবায়ন হ'ল শেলের পরিবেশে পরিবর্তনশীল রাখা সহজ, তবে এটি কার্যকর করা অসম্ভব হয়ে উঠবে export -p
।
bash
, রফতানি প্রকৃতপক্ষে বর্তমান শেলের পরিবেশে পরিবর্তনশীল যুক্ত করে, তবে এটি ক্ষেত্রে হয় না dash
। আমার কাছে মনে হয় বর্তমান শেলের পরিবেশের সাথে ভেরিয়েবল যুক্ত করা এর শব্দার্থবিজ্ঞানের বাস্তবায়নের সহজতম উপায় export
, তবে এই আচরণটি বাধ্যতামূলক নয়।
dash
এটির সাথে কী করতে হবে। মূল পোস্টারটি সম্পর্কে বিশেষভাবে জিজ্ঞাসা করছিল bash
।
bash
কিন্তু কোনও বোর্ন শেল বৈকল্পিকের জন্য সমানভাবে প্রযোজ্য। অতিরিক্ত সুনির্দিষ্ট হওয়া এবং উত্তরগুলির জন্য যা কেবলমাত্র প্রযোজ্য তা প্রদান bash
করা একটি দুর্দান্ত মন্দ।
bash
শেলের jQuery।
export makes the variable available to subshells, and that is correct
এটি পরিভাষার খুব বিভ্রান্তিকর ব্যবহার। সাবশেলগুলি export
ভেরিয়েবলের উত্তরাধিকারী হওয়ার দরকার নেই । উপপ্রসেসগুলি করে।
বলা হয়ে থাকে যে সাবশেলগুলি তৈরি করার সময় বাশ রফতানি করা প্রয়োজন হবে না, অন্যরা ঠিক এর বিপরীতে বলেছেন। এটা তোলে subshells মধ্যে পার্থক্য খেয়াল করা জরুরী (যাদের দ্বারা তৈরি করা হয় যে ()
, ``
, $()
বা loops) এবং subprocesses (প্রক্রিয়া উদাহরণস্বরূপ নামে প্রার্থনা হয়, আক্ষরিক bash
আপনার স্ক্রিপ্টটি প্রদর্শনে)।
এই দুটি কনস্ট্রাক্টের মধ্যে যা সাধারণ তা হ'ল উভয়টিই প্যারেন্ট শেলের কাছে ভেরিয়েবলগুলি পাস করতে পারে না।
$ noexport=noexport; export export=export; (echo subshell: $noexport $export; subshell=subshell); bash -c 'echo subprocess: $noexport $export; subprocess=subprocess'; echo parent: $subshell $subprocess
subshell: noexport export
subprocess: export
parent:
বিভ্রান্তির আরও একটি উত্স রয়েছে: কেউ কেউ মনে করেন যে 'কাঁটাচামচ' সাবপ্রসেসিসগুলি হ'ল অ-রফতানি চলকগুলি দেখেন না। সাধারণত কাঁটাচামচ (গুলি) এর সাথে সাথেই এক্সিকিউট () গুলি অনুসরণ করা হয়, এবং এজন্যই মনে হয় কাঁটাচামচ () কাঁটাচামচ করা জিনিস, যদিও বাস্তবে এটি এক্সিকিউট ()। আপনি exec
কমান্ডটি দিয়ে প্রথমে কাঁটাচামচ () না দিয়ে কমান্ড চালাতে পারেন এবং এই পদ্ধতিতে শুরু হওয়া প্রক্রিয়াগুলিরও অপ্রত্যাশিত ভেরিয়েবলের অ্যাক্সেস থাকবে না:
$ noexport=noexport; export export=export; exec bash -c 'echo execd process: $noexport $export; execd=execd'; echo parent: $execd
execd process: export
মনে রাখবেন যে আমরা এবার parent:
লাইনটি দেখতে পাচ্ছি না , কারণ আমরা exec
কমান্ডের সাথে প্যারেন্ট শেলটি প্রতিস্থাপন করেছি , সুতরাং এই কমান্ডটি কার্যকর করার মতো কিছুই অবশিষ্ট নেই।
&
) এছাড়াও একটি সাব-শেল তৈরি করে।
var=asdf bash -c 'echo $var'
বা কি সম্পর্কে var=asdf exec bash -c 'echo $var'
? আউটপুট হয় asdf
। ;
যদি পরিবর্তনশীল সংজ্ঞা পর স্থাপন করা পার্থক্য তোলে। এর ব্যাখ্যা কী হবে? দেখে মনে হচ্ছে var
( ;
কোনওভাবেই নেই ) কোনওভাবে প্রসারিত সাবপ্রোসেসের সাথে সম্পর্কিত, মূল শেলটির সাথে এর কোনও যোগসূত্র নেই। echo $var
দ্বিতীয় লাইনে কার্যকর হলে কিছুই প্রিন্ট করে না। কিন্তু এক সারিবদ্ধ var=asdf bash -c 'echo $var'; echo $var
দেয় asdf\nasdf
।
export NAME=value
সাব-প্রসেসের অর্থ রয়েছে এমন সেটিংস এবং ভেরিয়েবলগুলির জন্য।
NAME=value
অস্থায়ী বা লুপ ভেরিয়েবলের জন্য বর্তমান শেল প্রক্রিয়াটিতে ব্যক্তিগত।
আরও বিশদে, export
পরিবেশের পরিবর্তনশীল নাম চিহ্নিত করুন যা একটি উপ-প্রক্রিয়া এবং তার সাব-প্রসেসিসগুলিতে অনুলিপি করে creation সাব-প্রসেস থেকে কোনও নাম বা মান কখনও অনুলিপি করা হয় না।
একটি সাধারণ ত্রুটি হল সমান চিহ্নের চারপাশে একটি স্থান স্থাপন করা:
$ export FOO = "bar"
bash: export: `=': not a valid identifier
কেবলমাত্র রফতানি চলক ( B
) সাব-প্রসেস দ্বারা দেখা হয়:
$ A="Alice"; export B="Bob"; echo "echo A is \$A. B is \$B" | bash
A is . B is Bob
সাব-প্রসেসের পরিবর্তনগুলি মূল শেলটি পরিবর্তন করে না:
$ export B="Bob"; echo 'B="Banana"' | bash; echo $B
Bob
রফতানির জন্য চিহ্নিত ভেরিয়েবলগুলিতে সাব-প্রসেসটি তৈরি হওয়ার সময় মানগুলি অনুলিপি করা হয়েছে:
$ export B="Bob"; echo '(sleep 30; echo "Subprocess 1 has B=$B")' | bash &
[1] 3306
$ B="Banana"; echo '(sleep 30; echo "Subprocess 2 has B=$B")' | bash
Subprocess 1 has B=Bob
Subprocess 2 has B=Banana
[1]+ Done echo '(sleep 30; echo "Subprocess 1 has B=$B")' | bash
কেবল রফতানি চলকগুলি পরিবেশের অংশ হয়ে যায় ( man environ
):
$ ALICE="Alice"; export BOB="Bob"; env | grep "ALICE\|BOB"
BOB=Bob
সুতরাং, এখন এটি গ্রীষ্মের সূর্যের মতো পরিষ্কার হওয়া উচিত! ব্রেন অ্যাগনিউ, অ্যালেক্সপ এবং উইলিয়াম প্রসেলকে ধন্যবাদ জানাই।
এটি লক্ষ করা উচিত যে আপনি একটি পরিবর্তনশীল রফতানি করতে পারেন এবং পরে মান পরিবর্তন করতে পারেন। ভেরিয়েবলের পরিবর্তিত মান শিশু প্রসেসের জন্য উপলব্ধ। একবার রফতানিটি একটি চলকটির জন্য সেট হয়ে গেলে আপনি export -n <var>
সম্পত্তিটি সরিয়ে ফেলতে হবে ।
$ K=1
$ export K
$ K=2
$ bash -c 'echo ${K-unset}'
2
$ export -n K
$ bash -c 'echo ${K-unset}'
unset
আপনি ইতিমধ্যে জানেন যে, ইউএনআইএক্স প্রসেসকে পরিবেশের ভেরিয়েবলগুলির একটি সেট রাখতে দেয় যা কী / মান জোড়া, কী এবং মান উভয় স্ট্রিং থাকে। অপারেটিং সিস্টেম প্রতিটি প্রক্রিয়াটির জন্য পৃথক পৃথক এই জোড় রাখার জন্য দায়ী।
প্রোগ্রামটি এই ইউনিক্স এপিআইয়ের মাধ্যমে তার পরিবেশের পরিবর্তনগুলি অ্যাক্সেস করতে পারে:
char *getenv(const char *name);
int setenv(const char *name, const char *value, int override);
int unsetenv(const char *name);
প্রক্রিয়াগুলি পিতামাতার প্রক্রিয়াগুলি থেকে পরিবেশের পরিবর্তনগুলিও লাভ করে। অপারেটিং সিস্টেম শিশু প্রক্রিয়াটি তৈরি হওয়ার মুহুর্তে সমস্ত "এনভর "গুলির একটি অনুলিপি তৈরি করার জন্য দায়ী।
অন্যান্য শেলগুলির মধ্যে বাশ , ব্যবহারকারীদের অনুরোধে তার পরিবেশের ভেরিয়েবলগুলি সেট করতে সক্ষম। এই কি export
জন্য বিদ্যমান।
export
বাশের জন্য পরিবেশের পরিবর্তনশীল সেট করতে একটি বাশ কমান্ড। এই কমান্ডের সাথে সেট করা সমস্ত ভেরিয়েবলগুলি এই বাশ তৈরি করবে এমন সমস্ত প্রক্রিয়া দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত হবে।
বাশের আরেক ধরণের পরিবর্তনশীল হ'ল অভ্যন্তরীণ পরিবর্তনশীল vari যেহেতু বাশ কেবল ইন্টারেক্টিভ শেল নয়, এটি আসলে একটি স্ক্রিপ্ট ইন্টারপ্রেটার, অন্য কোনও দোভাষী হিসাবে (যেমন পাইথন) এটি নিজস্ব ভেরিয়েবলগুলির সেট রাখতে সক্ষম। এটি উল্লেখ করা উচিত যে বাশ (পাইথনের বিপরীতে) কেবল স্ট্রিং ভেরিয়েবল সমর্থন করে।
বাশ ভেরিয়েবলগুলি সংজ্ঞায়িত করার জন্য স্বরলিপিটি name=value
। এই ভেরিয়েবলগুলি বাশের ভিতরে থাকে এবং অপারেটিং সিস্টেম দ্বারা রক্ষিত পরিবেশের ভেরিয়েবলগুলির সাথে কোনও সম্পর্ক নেই।
শেল প্যারামিটারে আরও বেশি (ভেরিয়েবল সহ)
বাশ রেফারেন্স ম্যানুয়াল অনুসারে এটিও লক্ষণীয়:
যে কোনও সাধারণ কমান্ড বা ফাংশনের পরিবেশ শেল পরামিতিগুলিতে বর্ণিত হিসাবে প্যারামিটার অ্যাসাইনমেন্ট সহ উপস্থাপিত করে অস্থায়ীভাবে বাড়ানো যেতে পারে । এই কার্যনির্বাহী বিবৃতিগুলি কেবল সেই আদেশ দ্বারা প্রদর্শিত পরিবেশকে প্রভাবিত করে।
বিষয়গুলি সংক্ষিপ্ত করতে:
export
অপারেটিং সিস্টেমে পরিবেশ পরিবর্তনশীল সেট করতে ব্যবহৃত হয়। এই পরিবর্তনশীল বর্তমান বাশ প্রক্রিয়া দ্বারা তৈরি করা সমস্ত শিশু প্রক্রিয়াগুলির জন্য উপলব্ধ থাকবে।গৃহীত উত্তর এই বোঝা যায়, কিন্তু আমি শেল builtins করার স্পষ্ট সংযোগ স্থাপনে চাই:
ইতিমধ্যে উল্লিখিত হিসাবে, export
শেল এবং শিশু উভয় জন্য একটি পরিবর্তনশীল উপলব্ধ করা হবে। যদি export
এটি ব্যবহার না করা হয় তবে চলকটি কেবল শেলের মধ্যেই পাওয়া যায় এবং কেবল শেল বিল্টইনগুলি এটি অ্যাক্সেস করতে পারে।
এটাই,
tango=3
env | grep tango # prints nothing, since env is a child process
set | grep tango # prints tango=3 - "type set" shows `set` is a shell builtin
এখানে আরও একটি উদাহরণ এখানে রয়েছে:
VARTEST="value of VARTEST"
#export VARTEST="value of VARTEST"
sudo env | grep -i vartest
sudo echo ${SUDO_USER} ${SUDO_UID}:${SUDO_GID} "${VARTEST}"
sudo bash -c 'echo ${SUDO_USER} ${SUDO_UID}:${SUDO_GID} "${VARTEST}"'
কেবল রফতানি VARTEST ব্যবহার করে VARTEST এর মান sudo bash -c '...' তে পাওয়া যায়!
আরও উদাহরণের জন্য দেখুন:
bash-hackers.org/wiki/doku.php/scripting/processtree
ইউএনআইএক্সের দু'জন নির্মাতা, ব্রায়ান কর্নিগান এবং রব পাইক তাদের "দ্য ইউনিক্স প্রোগ্রামিং এনভায়রনমেন্ট" বইটিতে এটি ব্যাখ্যা করেছেন। শিরোনামের জন্য গুগল এবং আপনি সহজেই একটি পিডিএফ সংস্করণ পাবেন।
তারা 3..6 বিভাগে শেল ভেরিয়েবলগুলি সম্বোধন করে এবং বিভাগের export
শেষে কমান্ডের ব্যবহারের দিকে মনোনিবেশ করে :
আপনি যখন সাব-শেলগুলিতে ভেরিয়েবলের মান অ্যাক্সেসযোগ্য করতে চান, তখন শেলের এক্সপোর্ট কমান্ডটি ব্যবহার করা উচিত। (আপনি ভেবে দেখতে পারেন কেন সাব-শেল থেকে তার প্যারেন্টের কাছে ভেরিয়েবলের মান রফতানি করার কোনও উপায় নেই)।
পরিবেশে রফতানি পরিবর্তনশীল সত্তা (এনভিও) এবং পরিবেশে অ-রফতানি ভেরিয়েবলের মধ্যে পার্থক্য প্রদর্শনের জন্য:
আমি যদি এটি করি:
$ MYNAME=Fred
$ export OURNAME=Jim
তারপরে কেবল $ OURNAME env এ উপস্থিত হয়। ভেরিয়েবল $ MYNAME এনভির মধ্যে নেই।
$ env | grep NAME
OURNAME=Jim
তবে ভেরিয়েবল $ MYNAME শেলটিতে বিদ্যমান
$ echo $MYNAME
Fred
যদিও আলোচনায় সুস্পষ্টভাবে উল্লেখ না করা হয়েছে, অভ্যন্তরীণ ব্যাশ থেকে সাব-শেল তৈরি করার সময় রফতানিটি ব্যবহার করার প্রয়োজন নেই কারণ সমস্ত ভেরিয়েবলগুলি শিশু প্রক্রিয়াতে অনুলিপি করা হয়।
export name=value
পোর্টেবল নয়। আপনি ঠিক কী চান তার উপর নির্ভর করেname=value; export name
একটি পোর্টেবল সমাধানের জন্য চেষ্টা করুন ।