সংক্ষিপ্ত উত্তর
আপনার প্রশ্নে, দ্বিতীয় কমান্ড .
শেল বিল্টিন বা বিল্টিন না ব্যবহার করে source
। পরিবর্তে, আপনি অন্য কোনও এক্সিকিউটেবল ফাইলের সাথে যেমন নাম দিয়ে অনুরোধ করে প্রকৃতপক্ষে একটি পৃথক শেলের মধ্যে স্ক্রিপ্টটি চালাচ্ছেন । এটি এটিকে একটি পৃথক ভেরিয়েবলের সেট দেয় (যদিও আপনি যদি তার প্যারেন্ট শেলটিতে কোনও ভেরিয়েবল রফতানি করেন তবে এটি যে কোনও শিশু প্রক্রিয়ার জন্য পরিবেশগত পরিবর্তনশীল হবে , এবং তাই শিশু শেলের ভেরিয়েবলগুলিতে অন্তর্ভুক্ত করা হবে )। আপনি যদি /
কোনও স্থানটিতে পরিবর্তন করেন , তবে এটি এটি .
বিল্ট-ইন দিয়ে চালিত করবে , যা সমান source
।
বর্ধিত ব্যাখ্যা
এটি হ'ল source
বিল্ট-ইন শেলটির বাক্য গঠন , যা বর্তমান শেলের একটি স্ক্রিপ্টের বিষয়বস্তু সম্পাদন করে (এবং এটি বর্তমান শেলের ভেরিয়েবলগুলির সাহায্যে):
source testenv.sh
এটি .
অন্তর্নির্মিত বাক্য গঠন যা এই একই কাজ করে source
:
. testenv.sh
তবে, এই সিনট্যাক্সটি এক্সিকিউটেবল ফাইল হিসাবে স্ক্রিপ্টটি চালায়, এটি চালানোর জন্য একটি নতুন শেল চালু করে:
./testenv.sh
এটি .
বিল্ট-ইন ব্যবহার করছে না। বরং .
আপনি যে ফাইলটি চালাচ্ছেন তার পথে যাওয়ার অংশ। সাধারণভাবে বলতে গেলে, আপনি কোনও শেকলে কোনও এক্সিকিউটেবল ফাইল চালাতে পারবেন এমন নাম দিয়ে কমপক্ষে একটি /
অক্ষর রয়েছে run বর্তমান ডিরেক্টরিতে একটি ফাইল চালনা করা, এটির আগে আগে করা ./
সহজতম উপায়। বর্তমান ডিরেক্টরিটি আপনার PATH
না থাকলে আপনি কমান্ডটি দিয়ে স্ক্রিপ্টটি চালাতে পারবেন না testenv.sh
। এটি হ'ল বর্তমান ডিরেক্টরিতে লোকজন দুর্ঘটনাক্রমে ফাইল চালানো থেকে বিরত রাখা যখন তারা যখন PATH
পরিবেশের ভেরিয়েবলের তালিকাভুক্ত কোনও ডিরেক্টরিতে উপস্থিত কোনও সিস্টেম কমান্ড বা অন্য কোনও ফাইল কার্যকর করতে চায় ।
যেহেতু নাম দিয়ে কোনও ফাইল চালানো ( এটি source
বা এর পরিবর্তে .
) এটি একটি নতুন শেলের মধ্যে চালায়, এতে শেলের ভেরিয়েবলগুলির নিজস্ব সেট থাকবে। নতুন শেলটি কলিং প্রক্রিয়া থেকে পরিবেশের পরিবর্তনশীলগুলির উত্তরাধিকারী হয় (যা এই ক্ষেত্রে আপনার ইন্টারেক্টিভ শেল) এবং সেই পরিবেশের ভেরিয়েবলগুলি নতুন শেলের শেল ভেরিয়েবল হয়ে যায়। তবে নতুন শেলটিতে শেল ভেরিয়েবলটি পাঠানোর জন্য, নিম্নলিখিতগুলির মধ্যে একটি অবশ্যই হওয়া উচিত:
শেল ভেরিয়েবলটি রফতানি করা হয়েছে, যার ফলে এটি পরিবেশের পরিবর্তনশীল হতে পারে। export
এর জন্য অন্তর্নির্মিত শেলটি ব্যবহার করুন । আপনার উদাহরণে, আপনি ব্যবহার করতে পারেন export MY_VAR=12345
সেটে এবং এক ধাপে পরিবর্তনশীল রপ্তানি, অথবা যদি এটি ইতিমধ্যেই সেট করা হয় আপনি কেবল ব্যবহার করতে পারেন export MY_VAR
।
শেল ভেরিয়েবলটি আপনি যে কমান্ডটি চালাচ্ছেন তার জন্য স্পষ্টভাবে সেট এবং পাস করা হয়েছে, কারণ এটি কমান্ডটি চালিত হওয়ার সময়কালীন পরিবেশের পরিবর্তনশীল হতে পারে। এটি সাধারণত এটি সম্পাদন করে:
MY_VAR=12345 ./testenv.sh
যদি MY_VAR
একটি শেল পরিবর্তনশীল করেছে যে রপ্তানি করা হয় নি হয়, আপনি এমনকি চালাতে পারেন testenv.sh
সঙ্গে MY_VAR
দ্বারা একটি এনভায়রনমেন্ট ভেরিয়েবল হিসাবে পাস নিজেই এটা সেটিং :
MY_VAR="$MY_VAR" ./testenv.sh
./
স্ক্রিপ্টগুলির সিনট্যাক্সের জন্য কাজ করার জন্য একটি হ্যাশবাং লাইন প্রয়োজন (সঠিকভাবে)
উপায় দ্বারা, দয়া করে মনে রাখবেন, যখন আপনি নামে একটি এক্সিকিউটেবল উপরে হিসাবে (এবং সঙ্গে ডাকা .
বা source
শেল বিল্ট-ইন), কি প্রোগ্রাম শেল চালানোর জন্য এটা করা হয় ব্যবহার করা হয় না সাধারণত কি শেল তা থেকে চালাচ্ছেন দ্বারা নির্ধারিত । পরিবর্তে:
বাইনারি ফাইলগুলির জন্য, কার্নেলটি নির্দিষ্ট ধরণের ফাইল চালানোর জন্য কনফিগার করা যেতে পারে। এটি "ম্যাজিক নম্বর" এর জন্য ফাইলের প্রথম দুটি বাইট পরীক্ষা করে যা এটি নির্দেশ করে যে এটি কোন ধরণের বাইনারি কার্যকর হতে পারে। এক্সিকিউটেবল বাইনারিগুলি এভাবে চালাতে সক্ষম হয়।
এটি অবশ্যই অত্যন্ত গুরুত্বপূর্ণ, কারণ একটি স্ক্রিপ্ট শেল বা অন্যান্য দোভাষী ছাড়া চালানো যায় না, যা এক্সিকিউটেবল বাইনারি! এছাড়াও, অনেক কমান্ড এবং অ্যাপ্লিকেশনগুলি স্ক্রিপ্টগুলির পরিবর্তে বাইনারিগুলি সংকলিত হয়।
( #!
এটি "ম্যাজিক নম্বর" এর পাঠ্য উপস্থাপনা যা কোনও পাঠ্য কার্যকর হতে পারে তা নির্দেশ করে))
যে ফাইলগুলি শেল বা অন্য ব্যাখ্যামূলক ভাষায় চালিত হওয়ার কথা, তাদের জন্য প্রথম লাইনটি দেখতে পাওয়া যায়:
#!/bin/sh
/bin/sh
প্রোগ্রামটি চালানোর উদ্দেশ্যে অন্যান্য শেল বা দোভাষীর সাথে প্রতিস্থাপন করা যেতে পারে। উদাহরণস্বরূপ, পাইথন প্রোগ্রামটি লাইন দিয়ে শুরু হতে পারে:
#!/usr/bin/python
এই রেখাগুলি হ্যাশবাং, শেবাং এবং অন্যান্য বেশ কয়েকটি অনুরূপ নাম বলে। এই فولডোক এন্ট্রিটি দেখুন , এই উইকিপিডিয়া নিবন্ধ এবং দোভাষী দ্বারা পড়া #! / বিন / শ দেখুন? আরও তথ্যের জন্য.
যদি কোনও পাঠ্য ফাইল এক্সিকিউটেবল হিসাবে চিহ্নিত হয় এবং আপনি এটি আপনার শেল (যেমন ./filename
) থেকে চালনা করেন তবে এটি দিয়ে শুরু হয় না#!
, কার্নেল এটি কার্যকর করতে ব্যর্থ হয়। যাইহোক, এটি ঘটেছে তা দেখে, আপনার শেলটি এর নামটি কয়েকটি শেলের কাছে দিয়ে এটি চালানোর চেষ্টা করবে । আছে কয়েক প্রয়োজনীয়তা উপর স্থাপন করা কি শেল যে ( "শেল শেল হচ্ছে কমান্ড সমতুল্য সিদ্ধান্ত নেবে | প্রার্থনা ..." )। অনুশীলনে , কিছু শাঁস - * সহ নিজের একটি অন্য উদাহরণ চালায়, অন্যরা ব্যবহার করেbash
/bin/sh
। আমি আপনাকে এড়াতে এবং পরিবর্তে একটি হ্যাশবাং লাইন ব্যবহার করার পরামর্শ দিচ্ছি (বা স্ক্রিপ্টটি এটি পছন্দসই দোভাষী হিসাবে প্রেরণ করে, যেমন, bash filename
)।
* জিএনইউ বাশ ম্যানুয়াল , ৩.7.২ কমান্ড সন্ধান এবং এক্সিকিউশন : "যদি এই এক্সিকিউশন ব্যর্থ হয় কারণ ফাইলটি এক্সিকিউটেবল ফর্ম্যাটে নেই এবং ফাইলটি ডিরেক্টরি নয়, তবে এটি শেল স্ক্রিপ্ট হিসাবে ধরে নেওয়া হয় এবং শেলটি বর্ণিত হিসাবে এটি কার্যকর করে" মধ্যে শেল স্ক্রিপ্ট । "
source
বলে মনে করি তা হ'ল ফাংশনগুলি আবার লোড বা প্রবর্তন না করে বাশ থেকে পাওয়া যায়। উদাহরণ#!/bin/bash function olakease {echo olakease;}
। একবার আপনি এটি লোড করার সাথেsource file.sh
সরাসরিolakease
ব্যাশ থেকে কল করতে পারেন । আমি সত্যিই এটি পছন্দ। উত্স কার্যকর করে তখন প্রচুর পরিমাণে লোড হয়, বিন্দুটি.
কেবল মৃত্যুদন্ড কার্যকর করার জন্য এবং ব্যবহারের মতো কিছুbash file.sh