আলিয়া বাশ ফাংশনে স্কোপিং


9

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

এখানে একটি ন্যূনতম উদাহরণ:

# aliases.sh
alias fooAlias='echo "this will never work!"'  

# .bashrc
function setupLotsOfThings() {
    source aliases.sh
    fooAlias
}

এখন, যদি আমি কেবল aliases.shইন্টারেক্টিভভাবে উত্স করি তবে জিনিসগুলি প্রত্যাশা অনুযায়ী কাজ করে:

[mycomputer]~/ $ source aliases.sh
[mycomputer]~/ $ fooAlias
this will never work!

যাইহোক, আমি যদি পরিবর্তে আমার .bashrc- এ সংজ্ঞায়িত ফাংশনটি কল করি, তবে এটির সংজ্ঞাটি উত্সাহ দেওয়ার পরে এটির নামটি সনাক্ত করতে পারে না:

[mycomputer]~/ $ setupLotsOfThings
-bash: fooAlias: command not found

এখানে কি হচ্ছে? aliasকোনও ফাংশনে ব্যবহার করার সময় কমান্ডের সুযোগ সম্পর্কে আমি কী অনুপস্থিত রয়েছি ?

সম্পাদনা করুন: আমি কী অর্জন করতে চাইছি তাতে কিছুটা আলোকিত করতে আমি সর্বনিম্ন উদাহরণের বাইরে কিছু বিশদ যুক্ত করব।

আমার কাজের জন্য আমি একটি ক্লাস্টার এবং / বা গ্রিডে প্রচুর সফ্টওয়্যার বিকাশ এবং পরিচালনা করি। আমার বেশ কয়েকটি প্রকল্প রয়েছে যার জন্য সম্পূর্ণ ভিন্ন পরিবেশের প্রয়োজন যেমন বিভিন্ন জিসিসি সংস্করণ, নির্দিষ্ট সফ্টওয়্যার রিলিজ, কনফিগারেশন এবং ডেটা PATHs এবং বিভিন্ন পরিবেশের ভেরিয়েবল। প্রশাসকরা বিভিন্ন জিনিস সেট আপ করার জন্য স্ক্রিপ্টগুলি সরবরাহ করে, সাধারণত শেল ফাংশন বা উপকরণগুলি সংজ্ঞায়িত করে যা অন্যান্য ফাংশন বা উপাধি বা বিভিন্ন স্ক্রিপ্ট চালায়। আমার কাছে এটি একটি কালো বাক্স।

আমি একক কমান্ড দিয়ে আমার নিজস্ব বিভিন্ন পরিবেশ নির্ধারণ করতে চাই। বর্তমানে, আমি এর মতো কিছু করি:

[mycomputer]~/ $ source /some/environment/setup/script.sh
[mycomputer]~/ $ aliasToSetupSomeSoftwareVersion    #this was defined in the above
[mycomputer]~/ $ anotherAliasForOtherSoftware
[mycomputer]~/ $ source /maybe/theres/another/script.sh
[mycomputer]~/ $ runSomeOtherSetup      # this was defined in the new script

এই কমান্ডগুলি সাধারণত চালানো হয়। আমার ধারণাটি মূলত কেবল উপরের রেখাগুলি একটি ফাংশন ব্লকে অনুলিপি করা ছিল, তবে মূল উদাহরণটি দেখায় যে এটি কেবল কাজ করে না। বিকল্প workaround স্বাগত চেয়ে বেশি!

উত্তর:


10

বিকল্প সমাধান হ'ল ফাংশন ব্লকের পরিবর্তে এই কমান্ডগুলিকে একটি পাঠ্য ফাইলে আটকানো। কিছুটা এইরকম:

## This is needed to make the sourced aliases available
## within the script.
shopt -s expand_aliases

source /some/environment/setup/script.sh
aliasToSetupSomeSoftwareVersion
anotherAliasForOtherSoftware
source /maybe/theres/another/script.sh
runSomeOtherSetup

setup1.shআপনি যেখানে খুশি তেমন সংরক্ষণ করুন । কৌশলটি তখন এই ফাইলটি উত্স করে দেওয়া , এটি চালানো নয়:

$ source setup1.sh

এটি স্ক্রিপ্টে থাকা উপাধিগুলি চালাবে এবং এগুলিকে আপনার বর্তমান শেলের জন্য উপলব্ধ করবে।

আপনি এটিতে যুক্ত করে প্রক্রিয়াটিকে আরও সহজ করতে পারেন .bashrc:

alias setupLotsOfThings="source setup1.sh"

এখন আপনি কেবল setupLotsOfThingsফাংশন থেকে চালাতে এবং আপনার পছন্দসই আচরণটি পেতে পারেন ।


ব্যাখ্যা

এখানে দুটি বিষয় আছে। প্রথমত, এলিয়াসগুলি যে ফাংশনটিতে ঘোষিত হয় তার জন্য উপলব্ধ নয় তবে কেবল একবার ফাংশনটি বের হয়ে গেলে এবং দ্বিতীয়টি যে স্ক্রিপ্টগুলির মধ্যে এলিয়াস উপলব্ধ নয়। উভয়ের একই বিভাগে ব্যাখ্যা করা হয়েছে man bash:

শেলটি ইন্টারেক্টিভ না হলে অ্যালিয়াসগুলি প্রসারিত হয় না, যদি না শপ বিকল্প ব্যবহার করে প্রসারিত_লিয়াস শেল বিকল্পটি সেট করা না হয় (নীচে শেল বিল্টিন কম্যান্ডের অধীনে শপটের বর্ণনা দেখুন)।

উপকরণের সংজ্ঞা এবং ব্যবহার সম্পর্কিত বিধিগুলি কিছুটা বিভ্রান্তিকর। বাশ সর্বদা line লাইনের যে কোনও কমান্ড কার্যকর করার আগে কমপক্ষে একটি সম্পূর্ণ ইনপুট লাইন পড়ে। কমান্ড পড়ার সময় উপাধিগুলি প্রসারিত হয়, যখন তা কার্যকর করা হয় না। সুতরাং, অন্য একটি কমান্ড হিসাবে একই লাইনে উপস্থিত একটি উপনাম সংজ্ঞাটি পরবর্তী ইনপুটটির লাইনটি পড়া না হওয়া পর্যন্ত কার্যকর হয় না। Line লাইনে ওরফে সংজ্ঞা অনুসরণকারী কমান্ডগুলি নতুন উপন্যাস দ্বারা প্রভাবিত হবে না। ফাংশনগুলি কার্যকর করা হলে এই আচরণটিও একটি সমস্যা। কোনও ফাংশন সংজ্ঞা পড়লে উপকরণগুলি প্রসারিত হয়, ফাংশনটি কার্যকর হওয়ার সময় নয়, কারণ কোনও ফাংশন সংজ্ঞা নিজেই একটি যৌগিক আদেশ হয়। ফলস্বরূপ, একটি ফাংশনটিতে সংজ্ঞায়িত এলিয়াসগুলি
সেই ফাংশনটি কার্যকর হওয়ার পরে পাওয়া যায় না।
নিরাপদে থাকার জন্য, সর্বদা পৃথক লাইনে উরফ সংজ্ঞা রাখুন, এবং কমound পাউন্ড কমান্ডগুলিতে উপনামটি ব্যবহার করবেন না।

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


ঠিক আছে, আমি একটি ক্লাস্টারে কাজ করছি, এবং এ জাতীয় বেশ কয়েকটি "আলিয়াজিং" স্ক্রিপ্ট উপলব্ধ রয়েছে যা সফ্টওয়্যার পরিবেশ নির্ধারণে সহায়তা করে, ইত্যাদি The উপন্যাস স্ক্রিপ্টটি বিভিন্ন ভিন্ন ভিন্ন নাম সংজ্ঞায়িত করে; আমার লক্ষ্যটি হ'ল সঠিক এলিয়াসগুলি সরবরাহ করে একটি নির্দিষ্ট পরিবেশ শুরু করা এবং তারপরে সেই স্থানীয় নামগুলি (কিছু) চালানো। ক্রমান্বয়ে বেশ কয়েকটি কমান্ড চালানোর চেয়ে আমি একক কমান্ডে এটি করব।
তাড়া করুন

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

@ কিনুন তবে সেগুলি কেবল তখনই চালিত হয় যখন আপনি দৌড়ান setupLotsOfThings, সেগুলি কেবল ফাংশনটিতে উপলব্ধ নয়। আপনি যে শেলটি থেকে ফাংশনটি কল করেছেন সেগুলি তারা কাজ করে। যাইহোক, যদি আপনার ফাংশনটি কেবলমাত্র উপকরণগুলি উত্স দেয় তবে কেন কেবল একটি উপাধি ব্যবহার করবেন না? উদাহরণস্বরূপ: alias setupstuff="source aliases.sh"
টেরডন

ঠিক আছে, তবে আমি প্রতি সেপ্টেম্বর সম্পর্কে সুযোগ নিয়ে চিন্তিত নই । আদর্শভাবে আমি কেবল "উত্স স্টাফ" এবং "চালিত উপকরণ" পদক্ষেপটি একের মধ্যে একত্রিত করতে চাই। সম্ভবত এটি 3 ফাংশন দিয়ে করা যেতে পারে? ফাংশন উত্স স্টাফ () {উত্স ...}; ফাংশন রান স্টাফ () {কিছু আলিয়াস; ...}; ফাংশন সেটআপলটস অফফিংস () {সোর্স স্টাফ; runStuff; };
তাড়া করুন

@ হ্যাঁ, আমি এটি ভেবেছিলাম কিন্তু এটি কার্যকর হয়নি :)। আপনার যা করা দরকার তা আরও কিছু দিয়ে আপনি নিজের প্রশ্নটি প্রসারিত করতে পারেন? ফাংশনগুলি কেবলমাত্র এত জটিলতার সাথে মোকাবিলা করতে পারে, পরিবর্তে আপনাকে কিছুটা স্ক্রিপ্ট লিখতে হতে পারে।
টেরডন

7

প্রকৃতপক্ষে, ফাংশনটি লোড হওয়ার পরে আপনার এলিয়াসগুলি উপলব্ধ! আপনি এগুলি আপনার ইন্টারেক্টিভ শেল বা .bashrcফাংশনটি সম্পাদন করার পরে ব্যবহার করতে পারেন ।

সীমাবদ্ধতাটি হ'ল ফাংশন সংজ্ঞাটি যখন ফাংশনটির মূল্যায়ন করা হয় না তখন ফাংশন সংজ্ঞাটি পড়লে প্রসারিত হয়। এটি ব্যাশের একটি সীমাবদ্ধতা। সুতরাং এটি কাজ করবে:

function setupLotsOfThings() {
    source aliases.sh
}
setupLotsOfThings
fooAlias

তবে এটি নয়:

function setupLotsOfThings() {
    source aliases.sh
}
function useTheAliases() {
    fooAlias
}
setupLotsOfThings
useTheAliases

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

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