সেট, রফতানি এবং এনভির মধ্যে পার্থক্য কী এবং আমি প্রতিটি ব্যবহার করা উচিত?


112

প্রতিবার প্রায়শই আমি কোনও ব্যাশ স্ক্রিপ্ট বার করে দেব এবং এটি আমাকে ভেরিয়েবল স্থাপনের কয়েকটি উপায় রয়েছে:

key=value
env key=value
export key=value

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

এই তিনটি পদ্ধতির মধ্যে পার্থক্য কী এবং আপনি আমাকে যখন নির্দিষ্টভাবে প্রতিটি ব্যবহার করতে চান তার একটি উদাহরণ দিতে পারেন?

অবশ্যই সম্পর্কিত `VAR = ...` এবং `রফতানি VAR = ... between এর মধ্যে পার্থক্য কী? তবে আমি envএটিতে কীভাবে খাপ খায় তা জানতে চাই এবং কয়েকটি উদাহরণের সুবিধাগুলিও খুব সুন্দর হবে :)


5
দ্রষ্টব্য যে export key=valueপ্রসারিত বাক্য গঠন এবং বহনযোগ্য স্ক্রিপ্টগুলিতে (যেমন #! /bin/sh) ব্যবহার করা উচিত নয় ।
সাইমন রিখটার

উত্তর:


110

আসুন আমরা একটি নির্দিষ্ট উদাহরণ বিবেচনা করি। grepকমান্ড একটি পরিবেশ পরিবর্তনশীল নামক ব্যবহার GREP_OPTIONSডিফল্ট বিকল্পসমূহ সেট করতে।

এখন। এই ফাইলটিতে test.txtনিম্নলিখিত লাইন রয়েছে:

line one
line two

কমান্ড চালানো grep one test.txtফিরে আসবে

line one

আপনি যদি -vবিকল্পটির সাথে গ্রেপ চালনা করেন তবে এটি মিলবে না এমন লাইনগুলি ফিরিয়ে দেবে, ফলে আউটপুট হবে

line two

আমরা এখন পরিবেশগত পরিবর্তনশীল সহ বিকল্পটি সেট করার চেষ্টা করব।

  1. exportআপনি যে কমান্ডগুলি কল করছেন তার পরিবেশ ছাড়াই সেট করা পরিবেশ পরিবর্তনশীলগুলি উত্তরাধিকার সূত্রে প্রাপ্ত হবে না।

    GREP_OPTIONS='-v'
    grep one test.txt

    ফলাফল:

    line one

    স্পষ্টতই, বিকল্পটি -vপাস হয়নি grep

    আপনি কেবল শেলটি ব্যবহারের জন্য কোনও ভেরিয়েবল সেট করার সময় আপনি এই ফর্মটি ব্যবহার করতে চান, উদাহরণস্বরূপ for i in * ; doআপনি রফতানি করতে চান না $i

  2. যাইহোক, ভেরিয়েবলটি সেই নির্দিষ্ট কমান্ড লাইনের পরিবেশে প্রেরণ করা হয়, সুতরাং আপনি এটি করতে পারেন

    GREP_OPTIONS='-v' grep one test.txt

    যা প্রত্যাশিত ফিরে আসবে

    line two

    আপনি এই ফর্মটি ব্যবহার করেন অস্থায়ীভাবে এই প্রোগ্রামটির আরম্ভ হওয়া বিশেষ ইভেন্টটির পরিবেশটি অস্থায়ীভাবে পরিবর্তনের জন্য।

  3. কোনও ভেরিয়েবল রফতানি করার কারণে ভেরিয়েবলটি উত্তরাধিকার সূত্রে প্রাপ্ত হয়:

    export GREP_OPTIONS='-v'
    grep one test.txt

    এখন ফিরে

    line two

    শেলটিতে পরবর্তীকালে শুরু হওয়া প্রক্রিয়াগুলির জন্য ভেরিয়েবল সেট করার এটি সর্বাধিক সাধারণ উপায়

  4. এই সব বাশ মধ্যে করা হয়েছিল। exportএকটি বাশ অন্তর্নির্মিত; VAR=whateverবাশ সিনট্যাক্স। envঅন্যদিকে, এটি একটি প্রোগ্রাম। যখন envডাকা হয়, নিম্নলিখিত জিনিসগুলি ঘটে:

    1. কমান্ডটি envএকটি নতুন প্রক্রিয়া হিসাবে কার্যকর করা হবে
    2. env পরিবেশ পরিবর্তন করে, এবং
    3. আর্গুমেন্ট হিসাবে সরবরাহ করা কমান্ডকে কল করে। envপ্রক্রিয়া দ্বারা প্রতিস্থাপিত হয় commandপ্রক্রিয়া।

    উদাহরণ:

    env GREP_OPTIONS='-v' grep one test.txt

    এই কমান্ডটি দুটি নতুন প্রক্রিয়া চালু করবে: (i) env এবং (ii) গ্রেপ (আসলে দ্বিতীয় প্রক্রিয়াটি প্রথমটি প্রতিস্থাপন করবে)। এর দৃষ্টিকোণ থেকে grepপ্রক্রিয়া, ফলাফল ঠিক চলমান হিসাবে একই

    GREP_OPTIONS='-v' grep one test.txt

    তবে আপনি বাশার বাইরে থাকলে বা অন্য শেলটি চালু করতে না চাইলে আপনি এই প্রতিমাটি ব্যবহার করতে পারেন (উদাহরণস্বরূপ, আপনি যখন কলের exec()পরিবর্তে ফাংশনগুলির পরিবার ব্যবহার করছেন system())।

অতিরিক্ত নোট অন #!/usr/bin/env

এজন্য আইডিয়ামটি #!/usr/bin/env interpreterবরং ব্যবহার করা হয় #!/usr/bin/interpreterenvকোনও প্রোগ্রামের পুরো পাথের প্রয়োজন হয় না, কারণ এটি execvp()ফাংশনটি ব্যবহার করে যা PATHশেলটির মতো চলকটি অনুসন্ধান করে এবং তারপরে কমান্ড রান দ্বারা নিজেকে প্রতিস্থাপন করে। সুতরাং, কোনও দোভাষী (পারল বা পাইথনের মতো) "পথে" কোথায় বসেছেন তা সন্ধান করতে এটি ব্যবহার করা যেতে পারে।

এর অর্থ হ'ল বর্তমান পথটি সংশোধন করে আপনি প্রভাব ফেলতে পারেন কোন পাইথন রূপটি ডাকা হবে। এটি নিম্নলিখিতগুলি সম্ভব করে তোলে:

echo -e '#!/usr/bin/bash\n\necho I am an evil interpreter!' > python
chmod a+x ./python
export PATH=.
calibre

পরিবর্তে ক্যালিবার আরম্ভের ফলাফল হবে

I am an evil interpreter!

GREP_OPTIONS = '- v' গ্রেপ এক পরীক্ষা.টিএসপি কাজ করে কেন? আমি ভেবেছিলাম '-ভি' এর পরে এটির একটি অর্ধযুগল দরকার (তবে আমি এটি চেষ্টা করেছি এবং এটি বাস্তবে কাজ করে))
জো

2
কারণ একটি সেমিকোলন দিয়ে এটি দুটি পৃথক বাশ আদেশ হিসাবে ব্যাখ্যা করা হয়; প্রথমটি পরিবর্তনশীল সেট করে (এটি রফতানি না করে), এবং দ্বিতীয়টি এমন পরিবেশের সাথে শুরু হয় যার পরিবর্তনশীল রফতানি হয় না। সেমিকোলন ব্যতীত, স্থানীয় পরিবেশ নির্ধারণের আগে এটি একটি কমান্ড (গ্রেপ)।
জানুয়ারী

envযদিও সমস্ত পরিবর্তনশীল কোথা থেকে আসে? মানে আপনি যখন নতুন শেলটি খোলেন আপনার সর্বদা কয়েকটি ভেরিয়েবল থাকে। তাই কিছু প্রোগ্রাম অবশ্যই exportএডিট করতে হবে , তাই না?
পিথিকোস

1
@ পিথিকোস এনভায়রনমেন্ট ভেরিয়েবলগুলি "পরিবেশের উত্সে সোর্সিং" দ্বারা সেট করা হয়। ডিফল্টরূপে, ব্যাশটি সিস্টেম-ব্যাপী বাশার্ক (বা প্রোফাইল.d বা বাশ_প্রফাইলে) উত্স উত্পন্ন করবে। তারপরে এটি আপনার ব্যবহারকারীকে ~ / .bashrc (এবং / অথবা or / .bash_profile) সূত্র দেয়। এই ফাইলগুলির মধ্যে অন্যটিতে অন্যান্য স্ক্রিপ্টগুলির উত্সের জন্য ব্যাশ কমান্ড থাকতে পারে, যাতে আপনি শেষ পর্যন্ত পুরো স্থান জুড়েই পরিবেশগত পরিবর্তনশীল থাকতে পারেন।
এরিক 21

5
কি হবে set var=blah?
সিএমসিডিগ্রাগনকাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.