আমি কেন আমার ব্যাশ স্ক্রিপ্টটি সম্পাদন করার সময় মডিউলগুলি লোড করতে পারি না, তবে কেবল যখন এটি উত্সাহ দেওয়া হয়?


13

আমি আমার সিস্টেমে প্যাকেজগুলি নিয়ন্ত্রণ করতে মডিউলগুলি ব্যবহার করছি এবং আমি python/2.7.2একটি মডিউল হিসাবে ইনস্টল করেছি । আমার সাধারণ পাইথন এক্সিকিউটেবল python_exe.pyযা আমি একটি সাধারণ 'ড্রাইভিং' স্ক্রিপ্ট থেকে কল করতে যাচ্ছি runit.shrunit.shস্ক্রিপ্টটি এমন দেখাচ্ছে:

#!/bin/bash
module load python/2.7.2
arg1=myarg1
arg2=15
arg3=$5
/path/to/python_exe.py -a $arg1 -b $arg2 -c $arg3

যাইহোক, যখন আমি কেবল চালাই ./runit.sh, এটি আমাকে "মডিউল: কমান্ডটি পাওয়া যায় নি" বিক্রি করে। আমি যখন source runit.shযাইহোক, এটি সঠিকভাবে মডিউলটি লোড করে। কেন?

উত্তর:


13

কারণ moduleকমান্ডটি একটি উপনাম বা শেল ফাংশন ( মডিউল (1) এ " প্যাকেজ সূচনা " দেখুন )। আপনি যখন বলবেন , এটি সরাসরি আপনার ইন্টারেক্টিভ শেলের মধ্যে কমান্ডটি টাইপ করার মতো । তবে যখন আপনি বলবেন , আপনি একটি নতুন, অ-ইন্টারেক্টিভ শেল চালাচ্ছেন। অ-ইন্টারেক্টিভ শেলগুলিতে সাধারণত স্ট্যান্ডার্ড অ্যালিয়াস এবং শেল ফাংশন সেট আপ হয় না।source runit.shmodule./runit.sh

মডিউল (1) বলছে, " শেল-নির্দিষ্ট সূচনা স্ক্রিপ্টটি শেলের মধ্যে সস করা হলে মডিউল প্যাকেজ এবং মডিউল কমান্ডটি আরম্ভ করা হয়। স্ক্রিপ্টটি মডিউল কমান্ড তৈরি করে , হয় একটি উপাধি বা শেল ফাংশন হিসাবে,… ”আপনার যদি moduleকোনও স্ক্রিপ্টে কমান্ডটি চালানোর প্রয়োজন হয় তবে সূচনা স্ক্রিপ্টটি সন্ধান করুন যা moduleকমান্ডটি নির্ধারণ করে এবং sourceএটি স্ক্রিপ্ট থেকে।


.Bashrc এবং .bash_profile ব্যবহারের মধ্যে এটি কি পার্থক্য? তাদের মধ্যে কেবল একটির ব্যবহারের জন্য মডিউল সিস্টেম শুরু করার জন্য প্রাথমিক রুটিন রয়েছে।
drjrm3

আপনি ঠিক কী জিজ্ঞাসা করছেন তা আমি নিশ্চিত নই। কিন্তু: ব্যাশ ডিফল্টরূপে নিম্নলিখিত (এই কর্ম অপশন মাধ্যমে ওভাররাইড করা যেতে পারে) আছে: লগ-ইন শেল সার্চ `~ / .bash_profile` কিন্তু ~/.bashrc, একটি ইন্টারেক্টিভ শেল করে একটি লগ-ইন শেল নয় (যেমন, আপনি কি পেতে আপনার টাইপ যদি bashযেমন একটি কমান্ড) পড়ে ~/.bashrcতবে না পড়ে ~/.bash_profileএবং একটি অ-ইন্টারেক্টিভ শেল (যেমন, একটি স্ক্রিপ্ট চালানো) নাও পড়ে। … (চালিয়ে যাওয়া)
স্কট

(চালিয়ে যাওয়া) ... #!/bin/bash -iকারণ সম্ভবত সাইরাস প্রস্তাব করেছিলেন - কারণ -iবিকল্পটি শেলটিকে ইন্টারঅ্যাকটিভ করে তোলে এবং তাই এটি পড়ার কারণ হবে ~/.bashrc। আইএমএইচও, ওভারকিল, কারণ ইন্টারেক্টিভ মোডটি অযাচিত ব্যাগেজ সহ আসতে পারে (যেমন লেখার মতো ~/.bash_history)। অন্যদিকে, যদি moduleএকটি উপাধি হিসাবে চিহ্নিত করা হয় (শেল ফাংশনের বিপরীতে), এটি না বললে এটি একটি ইন্টারঅ্যাক্টিভ শেলটিতে কাজ করবে না shopt -s expand_aliases, সুতরাং সাইরাস এর উত্তর সবচেয়ে ভাল।
স্কট

4

দেখে মনে হচ্ছে যে আপনার সিস্টেমে শেলের সাধারণ অনুরোধটি সংজ্ঞায়িত উপনাম (বা ফাংশন) এর উত্তরাধিকারী হয় না module, সুতরাং শেলটি এটি সন্ধান করতে সক্ষম হয় না (উদ্ধৃতি সহ নোটের নীচে দেখুন)। এটি কীভাবে বর্তমানে সংজ্ঞায়িত হয়েছে তা type moduleদেখতে প্রম্পট থেকে চেষ্টা করুন module

মূলত উত্স সহ আপনি যদি কীবোর্ড থেকে স্ক্রিপ্টের প্রতিটি লাইন লিখেন।
নোট করুন যে আপনি একদিকে বর্তমান শেলের সমস্ত নির্দিষ্ট ইতিহাস উত্তরাধিকার সূত্রে পেয়েছেন তবে অন্যদিকে বর্তমান শেলটি আপনার স্ক্রিপ্ট এবং moduleঅনুরোধের সমস্ত পক্ষের প্রভাবের অধীনে থাকবে ।

কোনও স্ক্রিপ্ট উত্স করতে এবং এটি সম্পাদনের মধ্যে পার্থক্য সম্পর্কে আপনি সুপার ইউজার সেপ্টেম্বর ২০০৯ বা ডিসেম্বর ২০০৯ , উবুন্টু ফেব্রুয়ারী ২০১১ , ইউনিক্স আগস্ট ২০১১ , স্ট্যাকওভারফ্লো ডিসেম্বর ২০১২ বা অন্য অনেক জায়গায় পড়তে পারেন ।

মডিউলফাইল বিভাগে এই বিষয়ে একটি সতর্কতা রয়েছে :

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

সুতরাং এটি কোনও স্ক্রিপ্টে চালানো আরও বুদ্ধিমান বলে মনে হচ্ছে

দ্বিতীয়টি সম্পাদন করতে আমি ভাবতে পারি:

  1. একটি ইন্টারেক্টিভ শেল ব্যবহার করতে , বর্তমান শেলের নির্দিষ্ট ইতিহাস অবহেলা করে , আপনার স্ক্রিপ্টের শেবাং এর সাহায্যে

    #!/bin/bash -i

    একটি ইন্টারেক্টিভ শেল টিটিটিতে ব্যবহারকারী ইনপুট থেকে কমান্ডগুলি পড়ে reads অন্যান্য জিনিসের মধ্যে, এই জাতীয় শেল অ্যাক্টিভেশনে স্টার্টআপ ফাইলগুলি পড়ে, একটি প্রম্পট প্রদর্শন করে এবং ডিফল্টরূপে কাজ নিয়ন্ত্রণ সক্ষম করে ...

  2. পরিবর্তে আপনি যদি বর্তমান শেলের নির্দিষ্ট গল্পটি উত্তরাধিকার সূত্রে পছন্দ করেন তবে আপনি এটি উত্স দেওয়ার চেষ্টা করতে পারেন ... তবে একটি সাব- শেলের মাধ্যমে

    ( source runit.sh )
  3. এর moduleসাথে type moduleতার বর্তমান নাম / ফাংশন সন্ধান করার চেষ্টা করুন যার ফলস্বরূপ আপনার স্ক্রিপ্টটি সংশোধন করুন। নোট করুন কিছু পরিবেশের পরিবর্তনশীল এর জন্য সেট করা যাবে না module
    আপনি যদি চান তবে আপনি ডিরেক্টরিতে সূচনা স্ক্রিপ্টগুলি খুঁজে পেতে পারেন $MODULESHOME/init/<shell>


মন্তব্য মডিউল প্রশ্নোত্তর
হিসাবে মনে আছে

একটি শিশু প্রক্রিয়া (স্ক্রিপ্ট) পিতামাতার প্রক্রিয়া পরিবেশ পরিবর্তন করতে পারে না। স্ক্রিপ্টের একটি মডিউল লোড কেবল স্ক্রিপ্টের জন্য পরিবেশকে প্রভাবিত করে। স্ক্রিপ্টটি বর্তমান পরিবেশ পরিবর্তন করার একমাত্র উপায় হ'ল স্ক্রিপ্টটি উত্স করা যা এটি বর্তমান প্রক্রিয়াতে পড়ে।

সুতরাং আপনি যদি বর্তমান পরিবেশটি সংশোধন করতে এড়াতে চান তবে আমি মনে করি শেবাং (1) পরিবর্তন করার চেষ্টা করা ভাল বা স্ক্রিপ্টটিকে একটি সাব-শেল (2) এ উত্সাহিত করা ভাল। আমি মামলার ব্যবহারযোগ্যতা সম্পর্কে পুরোপুরি নিশ্চিত নই (3)।


দ্রষ্টব্য মডিউলগুলির
ম্যানুয়াল এবং বিবরণ পৃষ্ঠাগুলি থেকে উদ্ধৃত অংশ

moduleমডিউল প্যাকেজের একটি ব্যবহারকারী ইন্টারফেস। moduleওরফে বা ফাংশন executes modulecmdপ্রোগ্রাম এবং শেল কমান্ড এর আউটপুট মূল্যায়ন হয়েছে। modulecmdশেলের ধরণ নির্দিষ্ট করার জন্য প্রথম যুক্তি ।

শেল-নির্দিষ্ট সূচনা স্ক্রিপ্টটি শেলের মধ্যে উত্সাহিত করা হলে মডিউল প্যাকেজ এবং moduleকমান্ডটি আরম্ভ করা হয় । স্ক্রিপ্টটি মডিউল কমান্ড তৈরি করে, হয় একটি উপাধি বা শেল ফাংশন হিসাবে, মডিউলগুলির পরিবেশ পরিবর্তনশীল তৈরি করে creates


তবে তিনি পিতামাতার প্রক্রিয়ার পরিবেশকে প্রভাবিত করার চেষ্টা করছেন না; তিনি কেবল তাঁর পাইথনকে স্ক্রিপ্ট থেকে চালানোর জন্য নির্বাহযোগ্য করার চেষ্টা করছেন । এছাড়াও, কেন তিনি "মডিউল: কমান্ডটি পাওয়া যায় নি" ত্রুটি বার্তাটি পেয়েছেন তা আপনার উত্তর ব্যাখ্যা করে না।
স্কট

@ স্কট ধন্যবাদ আমি অজান্তে উত্তরের বড় অংশটি কেটে কেবল একটি খণ্ড পোস্ট করেছি। উত্তর পুনর্লিখন।
হাস্তুর

1
+1 টি।  ( source runit.sh )একটি ভাল উত্তর; আমি এটা ভাবিনি। এবং রেফারেন্স একটি ভাল সংগ্রহ।
স্কট 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.