Marcel একটি নতুন শেল। এটি ঐতিহ্যবাহী শেলের সাথে অনেকভাবে সাদৃশ্য রাখে, কিন্তু কিছু কিছু বিষয়ে ভিন্নভাবে কাজ করে:
- Piping: সব শেল পাইপ ব্যবহার করে একটি কমান্ডের আউটপुट থেকে টেক্সট অন্য কমান্ডের ইনপুটে পাঠায়। Marcel স্ট্রিংয়ের বদলে স্ট্রাকচার্ড ডেটা পাইপ করে।
- Python: Marcel পাইথনে ইমপ্লিমেন্টেড এবং পাইথনকে নানাভাবে এক্সপোজ করে। আপনার কমান্ডে যদি ছোটখাটো লজিক দরকার হয়, marcel আপনাকে পাইথনে এক্সপ্রেস করতে দেয়।
- Scripting: Marcel স্ক্রিপ্টিং-এ একটি অনন্য পদ্ধতি নেয়। আপনি অবশ্যই marcel কমান্ডের একটি সিকোয়েন্স টেক্সট ফাইলে লিখে এক্সিকিউট করতে পারেন। কিন্তু Marcel একটি Python মডিউল হিসেবে APIও প্রদান করে। আপনি এই মডিউল ইমপোর্ট করে প্লেইন পাইথনের চেয়ে অনেক বেশি সুবিধাজনকভাবে পাইথন স্ক্রিপ্টিং করতে পারেন।
Marcel GPLv3 লাইসেন্স অধীনে লাইসেন্সড।
লিনাক্সে Marcel Modern Shell ইনস্টল করা
Marcel-এর জন্য Python 3.6 বা তার উপরের ভার্সন দরকার। এটি লিনাক্সে ডেভেলপ ও টেস্ট করা হয়েছে, এবং এটি অধিকাংশ macOS-এ কাজ করে। (আপনি যদি Windows-এ পোর্ট করতে বা macOS-এর ডিফিশিয়েন্সি ফিক্স করতে সাহায্য করতে চান, যোগাযোগ করুন।)
নিজের জন্য marcel ইনস্টল করতে:
# python3 -m pip install marcel
অথবা সব ইউজারের জন্য ইনস্টল করতে (যেমন /usr/local-এ):
$ sudo python3 -m pip install --prefix /usr/local marcel
একবার marcel ইনস্টল হলে, marcel কমান্ড চালিয়ে চেক করুন কাজ করছে কিনা, এবং তারপর marcel প্রম্পটে version কমান্ড রান করুন:
$ marcel
Marcel Shell কাস্টমাইজেশন
আপনি ~/.marcel.py ফাইলে marcel কাস্টমাইজ করতে পারেন, যা স্টার্টআপে পড়া হয় (এবং মডিফাই হলে রি-রিড হয়)। ফাইলের নাম থেকে বোঝা যায় marcel-এর কাস্টমাইজেশন পাইথনে করা হয়।
আপনি احتمالত প্রম্পট কাস্টমাইজ করতে চাবেন। এটি করতে PROMPT ভেরিয়েবলে একটি লিস্ট অ্যাসাইন করুন। উদাহরণস্বরূপ, আপনি আপনার প্রম্পট কరেন্ট ডিরেক্টরি হলে, গ্রিনে প্রিন্ট হলে, এরপর > ব্লুতে প্রিন্ট হলে চান:
PROMPT = [ Color(0, 4, 0), lambda: PWD, Color(0, 2, 5), '> ' ]
ফলাফল প্রম্পট এমন দেখাবে:
এটি bash-এ করা অপ্রস্পষ্ট PS1 কনফিগারেশনকে রিপ্লেস করে। Color(0, 4, 0) নির্দেশ করে গ্রিন, (আর্গুমেন্টগুলো RGB ভ্যালু, রেঞ্জ 0-5)। PWD আপনার করেন্ট ডিরেক্টরি রিপ্রেজেন্ট করার এনভায়রনমেন্ট ভেরিয়েবল এবং এই ভেরিয়েবলকে lambda: দিয়ে প্রিফিক্স করলে একটি ফাংশন জেনারেট হয় যা প্রতিবার প্রম্পট ডিসপ্লে হলে ইভ্যালুয়েট হয়।
~/.marcel.py পাইথন মডিউল ইমপোর্ট ও করতে পারে। যেমন, আপনি যদি math মডিউলের ফাংশনগুলো marcel কমান্ডে ব্যবহার করতে চান:
from math import *
এটি করার পর, আপনি সেই মডিউল থেকে সিম্বল রেফার করতে পারেন, যেমন pi:
নোট করুন pi প্যারেনথেসিসে ঘিরা আছে। সাধারণত, marcel পাইথন এক্সপ্রেশন ডিলিমিট করতে প্যারেনথেসিস ব্যবহার করে। তাই (pi) পাইথন এক্সপ্রেশন ইভ্যালুয়েট করে যা pi ভেরিয়েবলের ভ্যালু রিট্রিভ করে। আপনি ট্র্যাডিশনাল এনভায়রনমেন্ট ভেরিয়েবলও এইভাবে এক্সেস করতে পারেন, যেমন (USER) এবং (HOME), বা marcel-এর নামস্পেসে থাকা যেকোনো বৈধ পাইথন এক্সপ্রেশন।
আপনি অবশ্যই নিজের সিম্বল ডিফাইন করতে পারেন। উদাহরণস্বরূপ, আপনি ~/.marcel.py-এ এই ফাংশন ডেফিনিশন রাখলে:
def factorial(n):
f = 1
for i in range(1, n + 1):
f *= i
return f
তাহলে কমান্ড লাইনে factorial ফাংশন ব্যবহার করতে পারেন, যেমন:
Marcel Shell উদাহরণ
এখানে, আমরা marcel শেলের কিছু কমান্ড উদাহরণ শিখব।
এক্সটেনশন অনুযায়ী ফাইল সাইজ খুঁজুন
কারেন্ট ডিরেক্টরি রিকার্সিভলি এক্সপ্লোর করুন, ফাইলগুলোর এক্সটেনশন (যেমন .txt, .py ইত্যাদি) অনুযায়ী গ্রুপ করুন, এবং প্রতিটি গ্রুপের টোটাল ফাইল সাইজ কম্পিউট করুন।
Marcel-এ এটি এইভাবে করা যায়:
ls অপারেটর File অবজেক্টের একটি স্ট্রিম প্রডিউস করে (-fr মানে ডিরেক্টরি রিকার্সিভলি ভিজিট করুন এবং শুধু ফাইল রিটার্ন করুন)।
File অবজেক্টগুলো পাইপ হয়ে নেক্সট কমান্ড, map-এ যায়। map একটি পাইথন ফাংশন স্পেসিফাই করে, আউটারমোস্ট প্যারেনথেসিসে, যা প্রতিটি ফাইলকে একটি টাপলে ম্যাপ করে যেটিতে ফাইলটির এক্সটেনশন এবং সাইজ থাকে। (Marcel lambda কিওয়ার্ড উবলিশ করার অনুমতি দেয়।)
red (reduce) অপারেটর, টাপলের প্রথম পার্ট (extension) অনুযায়ী গ্রুপ করে এবং প্রতিটি গ্রুপের মধ্যে সাইজগুলো যোগ করে। রেজাল্ট এক্সটেনশন অনুযায়ী সোর্টেড থাকে।
হোস্ট এক্সিকিউটেবল এবং Marcel Pipeline
Pipelines marcel অপারেটর এবং হোস্ট এক্সিকিউটেবল এর মিশ্রণ থাকতে পারে। অপারেটর অবজেক্ট পাইপ করে, কিন্তু অপারেটর/এক্সিকিউটেবল বাউন্ডেরিতে, marcel স্ট্রিং পাইপ করে।
উদাহরণস্বরূপ, এই কমান্ড অপারেটর এবং এক্সিকিউটেবল কম্বাইন করে যেসব ইউজারর শেল /bin/bash তাদের ইউজারনেম লিস্ট করে:
$ cat /etc/passwd \
| map (line: line.split(':')) \
| select (*line: line[-1] == '/bin/bash') \
| map (*line: line[0]) \
| xargs echo
cat একটি লিনাক্স এক্সিকিউটেবল। এটি /etc/passwd পড়ে, এবং marcel এর কন্টেন্ট ডাউনস্ট্রিমে marcel অপারেটর map-এ পাইপ করে।
map-এ প্যারেনথেসাইজড আর্গুমেন্ট হলো একটি পাইথন ফাংশন যা লাইনগুলোকে : সেপারেটরে স্প্লিট করে, ৭-টাপল জেনারেট করে। select একটি marcel অপারেটর যার আর্গুমেন্ট হলো একটি পাইথন ফাংশন যা সেসব টাপল আইডেন্টিফাই করে যাদের লাস্ট ফিল্ড /bin/bash।
নেক্সট অপারেটর, আরেকটি map প্রতিটি ইনপুট টাপলের ইউজারনেম ফিল্ড রাখে। অবশেষে, xargs echo ইনকামিং ইউজারনেমগুলোকে এক লাইনে কম্বাইন করে যা stdout-এ প্রিন্ট হয়।
Marcel Shell-এ স্ক্রিপ্টিং
Python কখনো কখনো স্ক্রিপ্টিং ল্যাঙ্গুয়েজ হিসেবে বিবেচনা হয়, কিন্তু আসলে সেটি সেটি উদ্দেশ্যে ভালো কাজ করে না। সমস্যা হলো পাইথন থেকে শেল কমান্ড এবং অন্যান্য এক্সিকিউটেবল রান করা কামপ্লেক্স। আপনি os.system() ব্যবহার করতে পারেন, যা সিম্পল কিন্তু często stdin, stdout, stderr ডিল করার জন্য অডিকোয়েট। subprocess.Popen() বেশি পাওয়ারফুল কিন্তু ব্যবহার করা বেশি জটিল।
Marcel-এর পদ্ধতি হলো একটি মডিউল প্রদান করা যা marcel অপারেটরকে পাইথনের ল্যাঙ্গুয়েজ ফিচারসের সাথে ইন্টিগ্রেট করে। আগের উদাহরণটি পুনরাবৃত্তি করে, এক্সটেনশন অনুযায়ী ফাইল সাইজের যোগফল কম্পিউট করার পাইথন কোড:
from marcel.api import *
for ext, size in (ls(file=True, recursive=True) | map(lambda f: (f.suffix, f.size)) | red('.', '+')):
print(f'{ext}: {size})
শেল কমান্ডগুলো আগের মতোই, শুধু সিনট্যাক্টিক কনভেনশন ভিন্ন। তাই ls -fr হয়ে যায় ls(file=True, recursive=True)। map এবং red অপারেটরও আছে, পাইপ দিয়ে কানেক্টেড, শেল ভার্সনের মতো। পুরো শেল কমান্ড (ls … red) একটি পাইথন ইটারেটর ইয়িল্ড করে যাতে কমান্ডটি পাইথনের for লুপের সাথে ব্যবহার করা যায়।
Marcel Shell-এ ডেটাবেস এক্সেস
আপনি marcel পাইপলাইনের সাথে ডেটাবেস এক্সেস ইন্টিগ্রেট করতে পারেন। প্রথমে, কনফিগ ফাইলে ডেটাবেস এক্সেস কনফিগার করুন, ~/.marcel.py, যেমন:
define_db(name='jao', driver='psycopg2', dbname='acme', user='jao') DB_DEFAULT = 'jao'
এটি একটি Postgres ডেটাবেস নেমড acme কনফিগার করে, psycopg2 ড্রাইভার ব্যবহার করে। Marcel-এ থেকে কানেকশন jao ইউজার দিয়ে বने, এবং ডেটাবেস প্রোফাইল নেমড jao। (DB_DEFAULT jao ডেটাবেস প্রোফাইলকে ডিফল্ট হিসেবে স্পেসিফাই করে যদি কোনো প্রোফাইল স্পেসিফাই করা না থাকে।) এই কনফিগারেশন করার পর, ডেটাবেস এখন sql অপারেটর ব্যবহার করে কোয়েরি করা যায়, যেমন:
sql 'select part_name, quantity from part where quantity < 10' \ | out --csv –-file ~/reorder.csv
এই কমান্ড part নামক একটি টেবিল কোয়েরি করে, এবং কোয়েরি রেজাল্ট ফাইলে ~/reorder.csv ডাম্প করে, CSV ফরম্যাটে।
Marcel Shell-এ রিমোট এক্সেস
ডেটাবেস এক্সেসের মতোই, রিমোট এক্সেস ~/.marcel.py-এ কনফিগার করা যায়। উদাহরণস্বরূপ, এটি একটি ৪-নোড ক্লাস্টার কনফিগার করে:
define_remote(name='lab', user='frankenstein', identity='/home/frankenstein/.ssh/id_rsa', host=['10.0.0.100', '10.0.0.101', '10.0.0.102', '10.0.0.103'])
ক্লাস্টারকে marcel কমান্ডে a lab হিসেবে আইডেন্টিফাই করা যায়। user এবং identity প্যারামিটার লগইন ইনফো স্পেসিফাই করে, এবং host প্যারামিটার ক্লাস্টারের নোডগুলোর IP অ্যাড্রেস স্পেসিফাই করে।
ক্লাস্টার কনফিগার হওয়ার পর, সব নোড একসাথে অপারেট করা যায়। উদাহরণস্বরূপ, ক্লাস্টার জুড়ে প্রসেস pids এবং কমান্ড লাইন পাওয়ার জন্য:
@lab [ps | map (proc: (proc.pid, proc.commandline))]
এটি (IP অ্যাড্রেস, PID, কমান্ড লাইন) টাপলের একটি স্ট্রিম রিটার্ন করে।
আরও ইনফরমেশনের জন্য ভিজিট করুন:
Marcel খুব নতুন এবং সক্রিয় ডেভেলপমেন্টে। সাহায্য করতে চাইলে যোগাযোগ করুন।