রুবি, এক্সিকিউট, সিস্টেম এবং% x () বা ব্যাকটিক্সের মধ্যে পার্থক্য


370

নিম্নলিখিত রুবি পদ্ধতির মধ্যে পার্থক্য কী?

exec, systemএবং %x()বা ব্যাকটিক্স

আমি জানি যে তারা রুবির মাধ্যমে প্রোগ্রামিনালিভাবে টার্মিনাল কমান্ডগুলি কার্যকর করতে ব্যবহৃত হয় তবে আমি কেন এটির জন্য তিনটি ভিন্ন উপায় আছে তা জানতে চাই।


1
: এই আদেশ, এবং আরও অনেক কিছু, দস্তাবেজ বেশ ভাল ব্যাখ্যা করা আছে Exec সিস্টেম ব্যাকটিক
zetetic

1
এই বিষয়ে একটি দুর্দান্ত রুবি কুইকটিপস নিবন্ধ রয়েছে: শেল কমান্ডগুলি কার্যকর করুন
সাইমন পেরেপেলিটসা

6
যেহেতু কেউ এই পুরাতন থ্রেডটি খনন করেছেন, তাই "ওয়ার্কিং উইথ ইউনিক্স প্রসেসেস" রুবিবাদীদের পক্ষে এই বিষয়ে আগ্রহীদের জন্য একটি দুর্দান্ত বই: ওয়ার্কউইথিংইনিক্স প্রসেসস ডটকম
মাইকেল কোহল

1
আমি বিস্মিত কোন উত্তর উত্তর উল্লেখ sh
ডেনিস

@ ডেনিস যখন আমি এই প্রশ্নটি উত্থাপন করছিলাম রুবি ১.৯.৩ * প্রকাশিত হয়নি।
মিঃ ব্ল্যাক

উত্তর:


411

পদ্ধতি

systemপদ্ধতি একটি সিস্টেম প্রোগ্রাম কল। আপনাকে এই পদ্ধতির স্ট্রিং আর্গুমেন্ট হিসাবে কমান্ডটি সরবরাহ করতে হবে। উদাহরণ স্বরূপ:

>> system("date")
Wed Sep 4 22:03:44 CEST 2013
=> true

প্রার্থনা প্রোগ্রাম বর্তমান ব্যবহার করা হবে STDIN, STDOUTএবং STDERRআপনার রুবি প্রোগ্রামের অবজেক্ট। বস্তুত, প্রকৃত ফেরত মান হয় হয় true, falseবা nil। উদাহরণে তারিখটি আইও অবজেক্টের মাধ্যমে মুদ্রিত হয়েছিল STDINtrueপ্রক্রিয়াটি যদি শূন্য স্থিতি নিয়ে প্রস্থান করে, প্রক্রিয়াটি যদি শূন্য-স্থিতি স্থিতি 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

3
কিভাবে কল হ্যান্ডলগুলি আরো সূক্ষ্মাতিসূক্ষ্ম নিয়ন্ত্রণ এবং STDIN, STDOUT, STDERR, বিবেচনা Open3.popen3পরিবর্তে; যেমন দেখতে stackoverflow.com/a/10922097/258662
cboettig

1
ব্যাকটিক্স স্ট্রিং ইন্টারপোলেশন সমর্থন করে যা আমার সমস্যার সমাধান করেছে বলে উল্লেখ করার জন্য আপনাকে ধন্যবাদ।
এডিজি

244

এই উত্তরের উপর ভিত্তি করে এখানে একটি ফ্লোচার্ট দেওয়া আছে । একটি টার্মিনাল অনুকরণ করতে ব্যবহার করেscript দেখুন ।

এখানে চিত্র বর্ণনা লিখুন


3
এটি এত সহজ নয়। আমার ক্ষেত্রে এটি প্রক্রিয়া শেষ না হওয়া অবধি "ঠিক আছে (এবং প্রয়োজন) ছিল" এরপরে STDOUT / STDERR আউটপুটগুলি পরীক্ষা করতে popen3 ব্যবহার করুন।
নাকিলন

আপনি সর্বদা কিছুক্ষণ লুপের মধ্যে আবদ্ধ হয়ে একটি কার্যকরভাবে ব্লককে (কার্যকরভাবে) ব্লক করতে পারেন। আপনি এত সহজে কোনও নন-ব্লকিং কলটিতে একটি ব্লকিং কল করতে পারবেন না।
আয়ান

106

তারা বিভিন্ন কাজ করে। execবর্তমান প্রক্রিয়াটিকে নতুন প্রক্রিয়াতে প্রতিস্থাপন করে এবং কখনই ফিরে আসে নাsystemঅন্য একটি প্রক্রিয়া আহ্বান করে এবং বর্তমান প্রক্রিয়ায় তার প্রস্থান মূল্য ফেরত দেয়। ব্যাকটিক্স ব্যবহার করা অন্য প্রক্রিয়া চালিত করে এবং সেই প্রক্রিয়াটির আউটপুট বর্তমান প্রক্রিয়াতে ফিরিয়ে দেয়।

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