আপনি যদি রুবি থেকে একটি বাহ্যিক কমান্ড চালাতে চান…
…যেমন wkhtmltopdf একটি HTML ফাইলকে PDF এ রূপান্তর করতে।
কিছু রুবি পদ্ধতি আছে যা আপনি ব্যবহার করতে পারেন।
আপনি যে পদ্ধতিটি ব্যবহার করেন তার উপর নির্ভর করে আপনি ভিন্ন ফলাফল পাবেন .
আসুন একসাথে এই পদ্ধতিগুলি অন্বেষণ করি!
রুবি সিস্টেম পদ্ধতি
রুবি সিস্টেম পদ্ধতি একটি বহিরাগত কমান্ড চালানোর সবচেয়ে সহজ উপায়।
এটা এরকম দেখাচ্ছে :
system("ls")
লক্ষ্য করুন যে system
কমান্ড আউটপুট প্রিন্ট করবে যেমন এটি ঘটবে।
এছাড়াও সিস্টেম আপনার রুবি প্রোগ্রামকে কমান্ড সম্পন্ন না হওয়া পর্যন্ত অপেক্ষা করুন .
এটি চেষ্টা করুন:
system("sleep 2")
ব্যাকগ্রাউন্ডে কমান্ড চালানোর উপায় আছে যা আমরা পরে দেখব।
সিস্টেম 3টি সম্ভাব্য মান ফেরত দিতে পারে :
true
যদি কমান্ড কাজ করেfalse
যদি কমান্ড একটি ত্রুটি কোড প্রদান করেnil
যদি কমান্ড এক্সিকিউশন ব্যর্থ হয় (কমান্ড পাওয়া যায়নি)
আপনি প্রস্থান স্ট্যাটাস কোড পেতে পারেন আপনি $?
দিয়ে চালানো শেষ বাহ্যিক কমান্ডের বিশ্ব পরিবর্তনশীল। এই স্ট্যাটাস কোড আপনাকে কেন কমান্ড ব্যর্থ হয়েছে সে সম্পর্কে আরও তথ্য দিতে পারে।
শেল সম্প্রসারণ কি?
আপনি যখন system
দিয়ে একটি বাহ্যিক কমান্ড চালান আপনি "শেল প্রসারণ" প্রভাব পাবেন৷
শেল সম্প্রসারণ হল যখন শেল (sh/bash/zsh) কিছু বিশেষ অক্ষর (*
) নেয় , ?
, এবং [
) আপনার কমান্ড থেকে এবং এগুলিকে একটি ফাইল তালিকায় প্রসারিত করে .
উদাহরণ:
system("echo *")
এটি বর্তমান ডিরেক্টরির প্রতিটি ফাইল এবং ফোল্ডার মুদ্রণ করবে৷
*
কমান্ড চালানোর আগে ফাইলের তালিকা দিয়ে প্রতিস্থাপিত হয়।
আপনি যদি এই বিশেষ অক্ষরগুলিকে ২য় আর্গুমেন্ট হিসাবে আর্গুমেন্ট পাস করুন হিসাবে ব্যবহার করতে চান system
এর .
এই মত:
system("echo", "*")
এখন আউটপুট হবে *
.
পরিবেশ ভেরিয়েবল কিভাবে ব্যবহার করবেন
আপনি যদি একটি বাহ্যিক কমান্ডে একটি নির্দিষ্ট এনভায়রনমেন্ট ভেরিয়েবল পাস করতে চান আপনি প্রথম আর্গুমেন্ট হিসাবে একটি হ্যাশ ব্যবহার করতে পারেন .
এখানে একটি উদাহরণ:
system({"rubyguides" => "best"}, "ruby", "-e p ENV['rubyguides']") # "best"
এটি আপনার রুবি অ্যাপ্লিকেশনের বর্তমান পরিবেশ পরিবর্তন করবে না৷
%x / কার্নেল#`
আপনি যে কমান্ডটি চালাচ্ছেন তার থেকে আউটপুট পেতে চাইলে, এটি প্রদর্শনের পরিবর্তে আপনি %x
ব্যবহার করতে পারেন অথবা Kernel#`
পদ্ধতি।
তারা একই কাজ করে।
এখানে একটি উদাহরণ আছে :
`ls`
%x
সহ আরেকটি :
%x|ls|
এই দুটি উদাহরণ আউটপুট সহ একটি স্ট্রিং ফিরে আসবে ls
এর আদেশ৷
লক্ষ্য করুন যে আপনাকে এখনও কমান্ডটি শেষ হওয়ার জন্য অপেক্ষা করতে হবে যদি না আপনি এটি একটি থ্রেডের ভিতরে চালান।
একটি পৃথক প্রক্রিয়ায় বাহ্যিক কমান্ড চালানোর জন্য কীভাবে ফর্ক + এক্সেক ব্যবহার করবেন
ফোরকিং আপনার বর্তমান প্রক্রিয়ার (আপনার রুবি অ্যাপ) একটি অনুলিপি তৈরি করে তারপর আপনি এক্সেক ব্যবহার করে সেই অনুলিপিটিকে অন্য প্রক্রিয়ার সাথে প্রতিস্থাপন করতে পারেন .
দ্রষ্টব্য :কাঁটাচামচ পদ্ধতি উইন্ডোজে উপলব্ধ নয়৷
৷
এটি ইউনিক্স বিশ্বে একটি জনপ্রিয় প্যাটার্ন।
এটি কীভাবে কাজ করে তা এখানে রয়েছে :
fork { exec("ls") }
এটি ls
চালাবে অন্য প্রক্রিয়ায় এবং এর আউটপুট প্রদর্শন করুন।
কারণ এই কমান্ডটি অন্য প্রক্রিয়ায় চলছে এটি আপনার রুবি অ্যাপটিকে system
এর মতো চলতে বাধা দেবে না পদ্ধতি বা %x
.
গুরুত্বপূর্ণ:
আপনি যদি exec
ব্যবহার করেন fork
ছাড়া আপনি আপনার বর্তমান প্রক্রিয়া প্রতিস্থাপন করতে যাচ্ছেন।
এর মানে আপনার রুবি প্রোগ্রাম শেষ হয়ে যাবে।
একটি বহিরাগত প্রোগ্রামের সাথে দ্বিমুখী যোগাযোগের জন্য কীভাবে পোপেন পদ্ধতি ব্যবহার করবেন
আপনার প্রয়োজন হলে:
- প্রক্রিয়ার উপর আরো নিয়ন্ত্রণ
- দ্বিমুখী যোগাযোগ
তারপর IO.popen
আপনি যা খুঁজছেন তা হল পদ্ধতি৷
নিম্নলিখিত উদাহরণে আমি একটি irb
চালু করতে popen পদ্ধতি ব্যবহার করি প্রক্রিয়া করুন, তারপরে কিছু ইনপুট পাঠান এবং আউটপুট পড়ুন।
এখানে উদাহরণ :
r = IO.popen("irb", "r+") r.write "puts 123 + 1\n" 3.times { puts r.gets } r.write "exit\n"
এই r
ভেরিয়েবল হল একটি IO অবজেক্ট, এর মানে হল যে আপনি এটি থেকে একটি নিয়মিত ফাইলের মত লিখতে এবং পড়তে পারেন .
popen
ব্যবহার করা হচ্ছে এছাড়াও আপনার বাহ্যিক কমান্ড তার নিজস্ব প্রক্রিয়ায় চলবে, তাই আপনাকে এটিকে থ্রেডে চালাতে হবে না।
এছাড়াও একটি popen3
আছে আদর্শ লাইব্রেরিতে পদ্ধতি।
রেগুলার popen
এর সাথে পার্থক্য এটি নিয়মিত আউটপুট এবং ত্রুটি বার্তাগুলিকে পৃথক IO অবজেক্টে বিভক্ত করবে।
উপসংহার
আপনি রুবিতে বাহ্যিক কমান্ডের সাথে ইন্টারঅ্যাক্ট করার বিভিন্ন উপায় সম্পর্কে শিখেছেন।
এগুলো থেকে সাবধান!
আপনি নিরাপত্তা না চাইলে এই কমান্ডগুলিতে কোনো ধরনের ব্যবহারকারীর ইনপুট পাস করবেন না আপনার রুবি অ্যাপে সমস্যা।
আপনি যদি নতুন কিছু শিখে থাকেন তাহলে অনুগ্রহ করে এই নিবন্ধটি শেয়ার করুন যাতে আরো মানুষ এটি দেখতে পারে৷
৷পড়ার জন্য ধন্যবাদ 🙂