রফতানি বা ছাড়াই ভেরিয়েবলের সংজ্ঞা দেওয়া


955

কিসের exportজন্য?

পার্থক্য কি:

export name=value

এবং

name=value

4
স্পর্শকাতরভাবে নোট করুন যে export name=valueপোর্টেবল নয়। আপনি ঠিক কী চান তার উপর নির্ভর করে name=value; export nameএকটি পোর্টেবল সমাধানের জন্য চেষ্টা করুন ।
ট্রিপলি

উত্তর:


1054

export সাব-প্রসেসের ক্ষেত্রে ভেরিয়েবলকে উপলব্ধ করে তোলে।

এটাই,

export name=value

এর অর্থ হল যে শেল প্রক্রিয়াটি থেকে আপনি চালিত যে কোনও প্রক্রিয়ার জন্য চলক নামটি উপলব্ধ । আপনি যদি এই ভেরিয়েবলটি ব্যবহার করার জন্য কোনও প্রক্রিয়া চান তবে exportশেলটি থেকে প্রক্রিয়াটি ব্যবহার করুন এবং চালান।

name=value

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

এটি উল্লেখ করা গুরুত্বপূর্ণ যে কোনও ভেরিয়েবল রফতানি এটি প্যারেন্ট প্রসেসগুলিতে উপলব্ধ করে না। অর্থাত্, কোনও প্রবর্তিত প্রক্রিয়াতে একটি ভেরিয়েবল নির্দিষ্ট করা এবং রফতানি করা প্রবর্তনকারী প্রক্রিয়াটিতে এটি উপলব্ধ করে না।


105
বিশেষত রফতানি পরিবেশের মাধ্যমে শিশু প্রক্রিয়াগুলিতে পরিবর্তনশীল উপলব্ধ করে।
বিয়ানো

15
আমি আরও যুক্ত করব যে রফতানি যদি আপনার "উত্স" (যেমন ফাইলের নাম) কোনও ফাইলে থাকে তবে তা এটি আপনার কর্মক্ষম পরিবেশেও রফতানি করে।
রজারডপ্যাক

6
@ আরগারডপ্যাক আপনি কি রফতানি না করে তা করতে পারবেন না? বিড়াল> ব্লাহ \ না = হাই \ n। বাজে কথা; প্রতিধ্বনি $ ক; আমার জন্য 'হাই' আউটপুট দেয়।
ডেভিড উইনিস্কি

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

19
এটির একটি ধার-কেস রয়েছে; name=value command নেই পরিবর্তনশীল উপ-প্রক্রিয়ায় প্রাপ্তিসাধ্য না command
অলিভার চার্লসওয়ার্থ

254

অন্যান্য উত্তরগুলি কী বলছে তা বর্ণনা করার জন্য:

$ foo="Hello, World"
$ echo $foo
Hello, World
$ bar="Goodbye"
$ export foo
$ bash
bash-3.2$ echo $foo
Hello, World
bash-3.2$ echo $bar

bash-3.2$ 

9
এর আরও একটি উদাহরণal$ foobar="Whatever" bash
আলুন

70

অন্যরা উত্তর দিয়েছে যে রফতানি পরিবর্তনশীলগুলিকে সাব-শেলের জন্য উপলব্ধ করে এবং এটি সঠিক তবে কেবল একটি পার্শ্ব প্রতিক্রিয়া। আপনি যখন কোনও ভেরিয়েবল রফতানি করেন, এটি বর্তমান শেলের পরিবেশে (যেমন শেল কল putenv(3)বা setenv(3)) সেই পরিবর্তনশীলটিকে রাখে ।
প্রক্রিয়াটির পরিবেশ নির্বাহের মাধ্যমে উত্তরাধিকার সূত্রে প্রাপ্ত হয়, সাব-শেলের মধ্যে পরিবর্তনশীলকে দৃশ্যমান করে তোলে।

সম্পাদনা (5 বছরের দৃষ্টিকোণ সহ): এটি একটি নির্বোধ উত্তর। 'রফতানির' উদ্দেশ্য হ'ল ভেরিয়েবলগুলি "পরবর্তী সময়ে কার্যকর করা কমান্ডগুলির পরিবেশে থাকা", সেগুলি কমান্ডগুলি সাব-শেল বা সাবপ্রসেসিস কিনা। একটি নিষ্পাপ বাস্তবায়ন হ'ল শেলের পরিবেশে পরিবর্তনশীল রাখা সহজ, তবে এটি কার্যকর করা অসম্ভব হয়ে উঠবে export -p


6
নোট করুন যে এটি সম্পূর্ণ সত্য নয়। ইন bash, রফতানি প্রকৃতপক্ষে বর্তমান শেলের পরিবেশে পরিবর্তনশীল যুক্ত করে, তবে এটি ক্ষেত্রে হয় না dash। আমার কাছে মনে হয় বর্তমান শেলের পরিবেশের সাথে ভেরিয়েবল যুক্ত করা এর শব্দার্থবিজ্ঞানের বাস্তবায়নের সহজতম উপায় export, তবে এই আচরণটি বাধ্যতামূলক নয়।
উইলিয়াম পার্সেল

7
আমি নিশ্চিত যে dashএটির সাথে কী করতে হবে। মূল পোস্টারটি সম্পর্কে বিশেষভাবে জিজ্ঞাসা করছিল bash
স্টারফিশ

14
প্রশ্নটি ট্যাগ করা bashকিন্তু কোনও বোর্ন শেল বৈকল্পিকের জন্য সমানভাবে প্রযোজ্য। অতিরিক্ত সুনির্দিষ্ট হওয়া এবং উত্তরগুলির জন্য যা কেবলমাত্র প্রযোজ্য তা প্রদান bashকরা একটি দুর্দান্ত মন্দ।
উইলিয়াম পার্সেল

12
bashশেলের jQuery।
পোথেরকা

2
export makes the variable available to subshells, and that is correctএটি পরিভাষার খুব বিভ্রান্তিকর ব্যবহার। সাবশেলগুলি exportভেরিয়েবলের উত্তরাধিকারী হওয়ার দরকার নেই । উপপ্রসেসগুলি করে।
অমিত নাইডু

62

বলা হয়ে থাকে যে সাবশেলগুলি তৈরি করার সময় বাশ রফতানি করা প্রয়োজন হবে না, অন্যরা ঠিক এর বিপরীতে বলেছেন। এটা তোলে 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কমান্ডের সাথে প্যারেন্ট শেলটি প্রতিস্থাপন করেছি , সুতরাং এই কমান্ডটি কার্যকর করার মতো কিছুই অবশিষ্ট নেই।


আমি এমন লুপ কখনও দেখিনি যা (নিজেই) সাবসেল তৈরি করেছিল; একটি পাইপলাইন OTOH করে (সর্বদা সর্বদা শেষ ছাড়া অন্য টুকরো জন্য, কখনও কখনও আপনার শেল, সংস্করণ এবং বিকল্পগুলির উপর নির্ভর করে শেষের জন্য)। পটভূমি ( &) এছাড়াও একটি সাব-শেল তৈরি করে।
dave_thompson_085

এই 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
4xy

31

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
    

সুতরাং, এখন এটি গ্রীষ্মের সূর্যের মতো পরিষ্কার হওয়া উচিত! ব্রেন অ্যাগনিউ, অ্যালেক্সপ এবং উইলিয়াম প্রসেলকে ধন্যবাদ জানাই।


12

export বর্তমান শেল থেকে কাঁটাযুক্ত সমস্ত শেলের জন্য চলকটি উপলব্ধ করে তুলবে।


11

এটি লক্ষ করা উচিত যে আপনি একটি পরিবর্তনশীল রফতানি করতে পারেন এবং পরে মান পরিবর্তন করতে পারেন। ভেরিয়েবলের পরিবর্তিত মান শিশু প্রসেসের জন্য উপলব্ধ। একবার রফতানিটি একটি চলকটির জন্য সেট হয়ে গেলে আপনি export -n <var>সম্পত্তিটি সরিয়ে ফেলতে হবে ।

$ K=1
$ export K
$ K=2
$ bash -c 'echo ${K-unset}'
2
$ export -n K
$ bash -c 'echo ${K-unset}'
unset

ধন্যবাদ, আমি ঠিক সেই তথ্যটিই খুঁজছিলাম কারণ আমি এমন একটি স্ক্রিপ্ট দেখেছি যার মধ্যে পরিবেশের ভেরিয়েবল ব্যবহার করা হয়েছিল এবং তারপরে সেগুলিকে ডাব্লু / এক্সপোর্ট করে "পুনরায় রফতানি" করা হয়েছিল এবং আমি ভাবছিলাম যে এটি প্রয়োজনীয় কিনা।
মাইক লিপার্ট

8

আপনি ইতিমধ্যে জানেন যে, ইউএনআইএক্স প্রসেসকে পরিবেশের ভেরিয়েবলগুলির একটি সেট রাখতে দেয় যা কী / মান জোড়া, কী এবং মান উভয় স্ট্রিং থাকে। অপারেটিং সিস্টেম প্রতিটি প্রক্রিয়াটির জন্য পৃথক পৃথক এই জোড় রাখার জন্য দায়ী।

প্রোগ্রামটি এই ইউনিক্স এপিআইয়ের মাধ্যমে তার পরিবেশের পরিবর্তনগুলি অ্যাক্সেস করতে পারে:

  • 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অপারেটিং সিস্টেমে পরিবেশ পরিবর্তনশীল সেট করতে ব্যবহৃত হয়। এই পরিবর্তনশীল বর্তমান বাশ প্রক্রিয়া দ্বারা তৈরি করা সমস্ত শিশু প্রক্রিয়াগুলির জন্য উপলব্ধ থাকবে।
  • ব্যাশের চলক স্বরলিপি (নাম = মান) কেবলমাত্র ব্যাশের বর্তমান প্রক্রিয়াতে উপলব্ধ স্থানীয় ভেরিয়েবলগুলি সেট করতে ব্যবহৃত হয়
  • অন্য কমান্ডের উপসর্গ করা বাশ ভেরিয়েবল নোটেশন কেবল সেই কমান্ডের সুযোগের জন্য পরিবেশ পরিবর্তনশীল তৈরি করে।

1
বাশ ওয়ারগুলি পাইথনের মতো অনেক ধরণের সমর্থন করে না তবে স্ট্রিং, পূর্ণসংখ্যা এবং দুটি ধরণের অ্যারে রয়েছে ('ইনডেক্সড' / ট্র্যাডিশনাল এবং 'এসোসিয়েটিভ' যা অ্যাড্ক অ্যারে, পার্ল হ্যাশ বা পাইথন ডিকের অনুরূপ)। অন্যান্য শাঁস পৃথক; শুধুমাত্র স্ট্রিং পোর্টেবল হয়
dave_thompson_085

7

গৃহীত উত্তর এই বোঝা যায়, কিন্তু আমি শেল 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

3

এখানে আরও একটি উদাহরণ এখানে রয়েছে:

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 '...' তে পাওয়া যায়!

আরও উদাহরণের জন্য দেখুন:


3

ইউএনআইএক্সের দু'জন নির্মাতা, ব্রায়ান কর্নিগান এবং রব পাইক তাদের "দ্য ইউনিক্স প্রোগ্রামিং এনভায়রনমেন্ট" বইটিতে এটি ব্যাখ্যা করেছেন। শিরোনামের জন্য গুগল এবং আপনি সহজেই একটি পিডিএফ সংস্করণ পাবেন।

তারা 3..6 বিভাগে শেল ভেরিয়েবলগুলি সম্বোধন করে এবং বিভাগের exportশেষে কমান্ডের ব্যবহারের দিকে মনোনিবেশ করে :

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


2

পরিবেশে রফতানি পরিবর্তনশীল সত্তা (এনভিও) এবং পরিবেশে অ-রফতানি ভেরিয়েবলের মধ্যে পার্থক্য প্রদর্শনের জন্য:

আমি যদি এটি করি:

$ MYNAME=Fred
$ export OURNAME=Jim

তারপরে কেবল $ OURNAME env এ উপস্থিত হয়। ভেরিয়েবল $ MYNAME এনভির মধ্যে নেই।

$ env | grep NAME
OURNAME=Jim

তবে ভেরিয়েবল $ MYNAME শেলটিতে বিদ্যমান

$ echo $MYNAME
Fred

1

ডিফল্টরূপে, স্ক্রিপ্টের মধ্যে তৈরি ভেরিয়েবলগুলি কেবলমাত্র বর্তমান শেলের জন্য উপলব্ধ; শিশু প্রক্রিয়াগুলি (সাব-শেল) সেট করা বা সংশোধিত করা মানগুলিতে অ্যাক্সেস পাবে না। শিশুদের প্রক্রিয়াগুলি মানগুলি দেখতে দেয়, রফতানি কমান্ডের প্রয়োজন হয়।


0

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


আপনি যা বলছেন তা উপরের ডাব্লু / উদাহরণগুলিতে সরাসরি উত্তরগুলির বিরোধিতা করছে বলে দয়া করে ব্যাখ্যা করুন।
মাইক লিপার্ট

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