বৃহত্তর স্ক্রিপ্টকে একাধিক স্ক্রিপ্টে বিভক্ত করা এবং মূল স্ক্রিপ্টে তাদের উত্স করা কি সাধারণ?


23

এই মুহুর্তে আমি একটি বৃহত্তর বাশ স্ক্রিপ্টটি বিকাশ করছি (এটি আমার একটি ওপেন সোর্স প্রকল্প) এবং এটি জগাখিচুড়ি হতে শুরু করেছে। আমি যুক্তিগুলিকে ফাংশনগুলিতে বিভক্ত করেছি, স্থানীয় ভেরিয়েবলগুলি ব্যবহার করতে পারি যেখানে আমি করতে পারি এবং কেবলমাত্র মুষ্টিমেয় বৈশ্বিক ভেরিয়েবলগুলি ঘোষণা করেছি। তবুও, এটি বজায় রাখা বেশ শক্ত হয়ে উঠছে।

আমি স্ক্রিপ্টটিকে একাধিক স্ক্রিপ্টে বিভক্ত করার বিষয়ে চিন্তা করেছি এবং সেগুলি আমার মূল স্ক্রিপ্টে উত্পন্ন করেছি (অন্যান্য ভাষায় আমদানির অনুরূপ)।

তবে আমি ভাবছি যদি এটি একটি সম্ভাব্য পদ্ধতির হয়। প্রথমত, একাধিক স্ক্রিপ্টস সোর্সিং স্ক্রিপ্টের কার্যকর সময়কে তীব্রভাবে ধীর করতে পারে এবং দ্বিতীয়ত, এটি বিতরণকে আরও শক্ত করে তোলে।

সুতরাং, এটি কি একটি ভাল পদ্ধতির, এবং অন্যান্য (ওপেন সোর্স) প্রকল্পগুলি কি একইভাবে করে?


4
আমি একটি দীর্ঘ দীর্ঘ শেল স্ক্রিপ্ট এবং 3500 লাইন এবং 125 কেবিতে গিয়েছিলাম, আমি এটি বজায় রাখার চেষ্টা করতে চাই না। প্রোগ্রামগুলি হুক করার সময় শেলটি সত্যিই বন্ধুত্বপূর্ণ, তবে যখন এটি গণনা করার চেষ্টা করে, এটি বেশ কুৎসিত হয়। আমি জানি যে আপনার বেশিরভাগ কোড কাজ করে এবং এর পোর্টিংয়ের ব্যয় বেশি, তবে আপনি ভবিষ্যতে অন্য কোনও বিষয় বিবেচনা করতে চাইতে পারেন।
এমএসডব্লিউ

1
আমিও একই সমস্যায় পড়েছি। আমার কাছে একটি মাঝারি আকারের বড় বাশ প্রকল্পের উত্স আছেfor.net.net / প্রকল্পগুলি / ডুপ্লেক্সপ্রিপি । বর্তমানে, প্রতিটি স্ক্রিপ্ট স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত রয়েছে, তবে আমি সমস্ত সাধারণ ফাংশনকে একটি পৃথক ফাইল (গুলি) এ স্থানান্তরিত করার এবং তাদের একাধিক স্থানে আপডেট করার প্রয়োজন হ'তে এগুলি অন্তর্ভুক্ত করার বিষয়ে ভাবছি thinking সাধারণভাবে, আমি মনে করি কেবল প্রতিটি ক্রমিক স্ক্রিপ্টকে উত্স না করে কল করা ভাল। এটি অংশগুলি স্বতন্ত্রভাবে চালানো সম্ভব করে তোলে। তারপরে, আপনাকে আর্গুমেন্ট হিসাবে বা পরামিতি ফাইলগুলিতে ভেরিয়েবলগুলি পাস করতে হবে (বা আপনি যদি স্বতন্ত্র না চান তবে কেবল সেগুলি রফতানি করতে পারেন))
জো

উত্তর:


13

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


2
যদিও সে ক্ষেত্রে এটি পুনরায় ব্যবহারযোগ্যতার জন্য বেশি। বিভিন্ন স্ক্রিপ্ট শেল ফাংশনগুলির একটি সাধারণ গ্রন্থাগার ব্যবহার করে।
স্টাফেন চেজেলাস

16

শেল কি সেই সময়ে কাজের জন্য সঠিক সরঞ্জাম? একজন বিকাশকারী যিনি বিস্তৃত কোডের সমস্যার মধ্যে ঝাঁপিয়ে পড়েছেন আমি আপনাকে বলতে পারি যে পুনরায় লেখার বিষয়টি বিবেচনা করা উচিত নয় বরং পরিবর্তে আপনার অ্যাপ্লিকেশনটি বাড়ানোর জন্য যে স্কেলটি বাড়ানোর জন্য আপনি খুঁজছেন তার জন্য আরও উপযুক্ত কিছু হিসাবে আলাদা করে বিবেচনা করা উচিত - সম্ভবত পাইথন বা রুবি বা এমনকি পার্ল ?

শেল একটি ইউটিলিটি ভাষা - এটি একটি স্ক্রিপ্টিং ভাষা - এবং সুতরাং এটি আকারে এটি বাড়ানো শক্ত হবে।


আমি ঠিক এই পোস্টটি করতে যাচ্ছিলাম।
zwol

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

7

যদি এটি আপনার রক্ষণাবেক্ষণকে আরও সহজ করে তোলে তবে আপনার উভয়ই থাকতে পারে। এটিকে যৌক্তিক অংশগুলিতে বিভক্ত করুন যাতে আপনি এটি সহজেই বজায় রাখতে পারেন, তারপরে বিতরণ করার জন্য এটিকে আবার একসাথে রাখার জন্য একটি মেকফিল (যেমন,) লিখুন আপনি অন্তর্ভুক্ত ফাইল থেকে ফাংশন অনুলিপি করার জন্য কিছু দ্রুত স্ক্রিপ্ট লিখতে পারেন তার জায়গায় sourceলাইন বা কিছু ভালো তুচ্ছ করে (যদি আপনি এই পুনরায় tabify করতে হবে যেমন makeট্যাব প্রয়োজন):

all: myscript

myscript: includes/* body/*
    cat $^ > "$@" || (rm -f "$@"; exit 1)

তারপরে আপনার একটি "উত্স" সংস্করণ (সম্পাদনার জন্য ব্যবহৃত) এবং একটি "বাইনারি" সংস্করণ রয়েছে (তুচ্ছ ইনস্টলেশনের জন্য ব্যবহৃত)।


1
আহা! সাধারণ বিড়াল পদ্ধতির ব্যবহার করা অন্য কেউ :)
ক্লেটন স্ট্যানলি

4

আপনার বর্ণনা অনুসারে একটি স্ক্রিপ্ট ভেঙে যেতে পারে - প্রায় যা কিছু করা যায়। আমি বলব যে 'ভাল পদ্ধতি' আপনার বৃহত স্ক্রিপ্টকে ভাগ করা, আইপিসি পদ্ধতিগুলির মাধ্যমে যোগাযোগ করে এর অংশগুলি একটি পৃথক প্রক্রিয়া হিসাবে চালানো যেতে পারে তা নির্ধারণ করা।

এর বাইরেও, শেল স্ক্রিপ্টের জন্য, আমি এটি একটি একক ফাইল হিসাবে প্যাকেজ করব। আপনি যেমনটি বলেছেন, এটি বিতরণকে আরও শক্ত করে তোলে: আপনি 'লাইব্রেরি' স্ক্রিপ্টগুলি কোথায় রয়েছে তা জানতে হবে - শেল স্ক্রিপ্টগুলির জন্য কোনও ভাল মানের নেই - বা তাদের পথটি সঠিকভাবে সেট করতে ব্যবহারকারীকে নির্ভর করুন।

আপনি একটি ইনস্টলেশন প্রোগ্রাম বিতরণ করতে পারেন যা আপনার জন্য এই সমস্ত পরিচালনা করে, ফাইলগুলি বের করে, যথাস্থানে রেখে, ব্যবহারকারীকে export PROGRAMDIR=$HOME/lib/PROGRAM~ / .bashrc ফাইলের মতো কিছু যুক্ত করতে বলে । যদি $PROGRAMDIRসেট না করা থাকে বা আপনার প্রত্যাশিত ফাইলগুলি না থাকে তবে মূল প্রোগ্রামটি ব্যর্থ হতে পারে ।

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


1

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

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

ছোট, স্ব-অন্তর্ভুক্ত স্ক্রিপ্টগুলির একটি গোষ্ঠী ইনস্টল করা আরও শক্ত সমস্যার মধ্যে চলে।


1

স্ক্রিপ্টগুলি উত্সাহিত করার বিকল্প হ'ল তাদের যুক্তি দিয়ে কল করা। যদি আপনি ইতিমধ্যে আপনার বেশিরভাগ কার্যকারিতা শেল ফাংশনে বিভক্ত করেন তবে আপনি সম্ভবত ইতিমধ্যে এটি করতে সক্ষম হবেন এর খুব কাছাকাছি। নীচের বাশের স্নিপেট একটি স্ক্রিপ্টে ঘোষিত যে কোনও ক্রিয়াকলাপকে উপ-কম্যান্ড হিসাবে ব্যবহারের অনুমতি দেয়:

if [[ ${1:-} ]] && declare -F | cut -d' ' -f3 | fgrep -qx -- "${1:-}"
then "$@"
else main "$@" # Try the main function if args don't match a declaration.
fi

না করার কারণ sourceহ'ল পরিবেশ এবং বিকল্প দূষণ এড়ানো।


0

এখানে একটি বড় ব্যাশ স্ক্রিপ্ট কীভাবে একাধিক ফাইলগুলিতে বিভক্ত হয়ে তার ফলস্বরূপ একটি স্ক্রিপ্টে তৈরি করা যায় তার উদাহরণ এখানে দেওয়া হয়েছে: https://github.com/zinovyev/bash-project

আমি Makefileএই উদ্দেশ্যে একটি ব্যবহার:

TARGET_FILE = "target.sh"
PRJ_SRC = "${PWD}/src/main.sh"
PRJ_LIB = $(shell ls -d ${PWD}/lib/*) # All files from ./lib

export PRJ_LIB

SHELL := /bin/env bash
all: define_main add_dependencies invoke_main

define_main:
    echo -e "#!/usr/bin/env bash\n" > ${TARGET_FILE}
    echo -e "function main() {\n" >> ${TARGET_FILE}
    cat "${PRJ_SRC}" | sed -e 's/^/  /g' >> ${TARGET_FILE}
    echo -e "\n}\n" >> ${TARGET_FILE}

invoke_main:
    echo "main \$$@" >> ${TARGET_FILE}

add_dependencies:
    for filename in $${PRJ_LIB[*]}; do cat $${filename} >> ${TARGET_FILE}; echo >> ${TARGET_FILE}; done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.