নিম্নলিখিত রুবি পদ্ধতির মধ্যে পার্থক্য কী?
exec
, system
এবং %x()
বা ব্যাকটিক্স
আমি জানি যে তারা রুবির মাধ্যমে প্রোগ্রামিনালিভাবে টার্মিনাল কমান্ডগুলি কার্যকর করতে ব্যবহৃত হয় তবে আমি কেন এটির জন্য তিনটি ভিন্ন উপায় আছে তা জানতে চাই।
নিম্নলিখিত রুবি পদ্ধতির মধ্যে পার্থক্য কী?
exec
, system
এবং %x()
বা ব্যাকটিক্স
আমি জানি যে তারা রুবির মাধ্যমে প্রোগ্রামিনালিভাবে টার্মিনাল কমান্ডগুলি কার্যকর করতে ব্যবহৃত হয় তবে আমি কেন এটির জন্য তিনটি ভিন্ন উপায় আছে তা জানতে চাই।
উত্তর:
পদ্ধতি
system
পদ্ধতি একটি সিস্টেম প্রোগ্রাম কল। আপনাকে এই পদ্ধতির স্ট্রিং আর্গুমেন্ট হিসাবে কমান্ডটি সরবরাহ করতে হবে। উদাহরণ স্বরূপ:
>> system("date")
Wed Sep 4 22:03:44 CEST 2013
=> true
প্রার্থনা প্রোগ্রাম বর্তমান ব্যবহার করা হবে STDIN
, STDOUT
এবং STDERR
আপনার রুবি প্রোগ্রামের অবজেক্ট। বস্তুত, প্রকৃত ফেরত মান হয় হয় true
, false
বা nil
। উদাহরণে তারিখটি আইও অবজেক্টের মাধ্যমে মুদ্রিত হয়েছিল STDIN
। true
প্রক্রিয়াটি যদি শূন্য স্থিতি নিয়ে প্রস্থান করে, প্রক্রিয়াটি যদি শূন্য-স্থিতি স্থিতি false
দিয়ে বেরিয়ে আসে এবং nil
যদি কার্যকারিতা ব্যর্থ হয় তবে পদ্ধতিটি ফিরে আসবে ।
আর একটি পার্শ্ব প্রতিক্রিয়া হ'ল গ্লোবাল ভেরিয়েবল $?
একটি Process::Status
বস্তুর জন্য সেট করা আছে । অনুরোধ করা প্রক্রিয়াটির প্রসেসার আইডেন্টিফায়ার (পিআইডি) এবং প্রস্থান স্থিতিসহ কলটি নিজেই কল সম্পর্কিত তথ্য থাকবে।
>> system("date")
Wed Sep 4 22:11:02 CEST 2013
=> true
>> $?
=> #<Process::Status: pid 15470 exit 0>
ব্যাকটিক
ব্যাকটিক্স (``) একটি সিস্টেম প্রোগ্রামকে কল করে এবং তার আউটপুট ফেরত দেয়। প্রথম পদ্ধতির বিপরীতে, কমান্ডটি স্ট্রিংয়ের মাধ্যমে সরবরাহ করা হয় না, তবে ব্যাকটিক্স জোড়ার ভিতরে রেখে।
>> `date`
=> Wed Sep 4 22:22:51 CEST 2013
গ্লোবাল ভেরিয়েবলটি $?
ব্যাকটিক্সের মাধ্যমেও সেট করা থাকে। ব্যাকটিক্সের সাহায্যে আপনি স্ট্রিং ইন্টারপোলেশনও ব্যবহার করতে পারেন।
%এক্স()
ব্যবহার %x
করা ব্যাকটিক্স শৈলীর বিকল্প is এটি আউটপুটও ফিরে আসবে। এর আত্মীয়দের মতো %w
এবং %q
(অন্যদের মধ্যে), যেকোন ডিলিমিটার যতক্ষণ বন্ধনী স্টাইলের ডিলিমিটর মিলবে ততক্ষণ যথেষ্ট। এর অর্থ %x(date)
, %x{date}
এবং %x-date-
সমস্ত প্রতিশব্দ। ব্যাকটিকগুলি %x
স্ট্রিং ইন্টারপোলেশন ব্যবহার করতে পারে।
Exec
Kernel#exec
বর্তমান প্রক্রিয়াটি ব্যবহার করে (আপনার রুবি স্ক্রিপ্ট) পরিবর্তিত প্রক্রিয়াটি পরিবর্তিত হবে exec
। পদ্ধতিটি আর্গুমেন্ট হিসাবে একটি স্ট্রিং নিতে পারে। এই ক্ষেত্রে স্ট্রিং শেল প্রসারণ সাপেক্ষে। একাধিক যুক্তি ব্যবহার করার সময়, প্রথমটি একটি প্রোগ্রাম চালানোতে ব্যবহৃত হয় এবং নিম্নলিখিতটি প্রোগ্রামটির আর্গুমেন্ট হিসাবে সরবরাহ করা হয়।
Open3.popen3
কখনও কখনও প্রয়োজনীয় তথ্য স্ট্যান্ডার্ড ইনপুট বা স্ট্যান্ডার্ড ত্রুটিতে লিখিত হয় এবং আপনার পাশাপাশি সেগুলি নিয়ন্ত্রণ করাও দরকার। এখানে Open3.popen3
কাজে আসে:
require 'open3'
Open3.popen3("curl http://example.com") do |stdin, stdout, stderr, thread|
pid = thread.pid
puts stdout.read.chomp
end
STDIN
, STDOUT
, STDERR
, বিবেচনা Open3.popen3
পরিবর্তে; যেমন দেখতে stackoverflow.com/a/10922097/258662
এই উত্তরের উপর ভিত্তি করে এখানে একটি ফ্লোচার্ট দেওয়া আছে । একটি টার্মিনাল অনুকরণ করতে ব্যবহার করেscript
দেখুন ।
তারা বিভিন্ন কাজ করে। exec
বর্তমান প্রক্রিয়াটিকে নতুন প্রক্রিয়াতে প্রতিস্থাপন করে এবং কখনই ফিরে আসে না । system
অন্য একটি প্রক্রিয়া আহ্বান করে এবং বর্তমান প্রক্রিয়ায় তার প্রস্থান মূল্য ফেরত দেয়। ব্যাকটিক্স ব্যবহার করা অন্য প্রক্রিয়া চালিত করে এবং সেই প্রক্রিয়াটির আউটপুট বর্তমান প্রক্রিয়াতে ফিরিয়ে দেয়।