রুবি স্ক্রিপ্টের মধ্যে কমান্ড লাইন কমান্ড চলমান


92

রুবির মাধ্যমে কমান্ড লাইন কমান্ড চালানোর কোনও উপায় আছে কি? আমি একটি ছোট্ট রুবি প্রোগ্রাম তৈরির চেষ্টা করছি যা 'স্ক্রিন', 'আরসিএসজি' ইত্যাদি কমান্ড লাইন প্রোগ্রামের মাধ্যমে ডায়াল করে গ্রহণ / প্রেরণ করবে

আমি যদি রুবির (মাইএসকিউএল ব্যাকএন্ড, ইত্যাদি) এর সাথে এই সমস্তগুলি বেঁধে রাখতে পারি তবে দুর্দান্ত হবে would


উত্তর:


209

হ্যাঁ. বিভিন্ন উপায় আছে:


ক। ব্যবহার করুন %xবা '`':

%x(echo hi) #=> "hi\n"
%x(echo hi >&2) #=> "" (prints 'hi' to stderr)

`echo hi` #=> "hi\n"
`echo hi >&2` #=> "" (prints 'hi' to stderr)

এই পদ্ধতিগুলি stdout ফিরিয়ে দেবে, এবং স্টাডারকে প্রোগ্রামের দিকে পুনর্নির্দেশ করবে।


খ। ব্যবহার system:

system 'echo hi' #=> true (prints 'hi')
system 'echo hi >&2' #=> true (prints 'hi' to stderr)
system 'exit 1' #=> nil

trueকমান্ডটি সফল হলে এই পদ্ধতিটি ফিরে আসে । এটি প্রোগ্রামের সমস্ত আউটপুট পুনঃনির্দেশ করে।


গ। ব্যবহার exec:

fork { exec 'sleep 60' } # you see a new process in top, "sleep", but no extra ruby process. 
exec 'echo hi' # prints 'hi'
# the code will never get here.

যা কমান্ড দ্বারা তৈরি করা বর্তমান প্রক্রিয়াটিকে প্রতিস্থাপন করে।


d। (রুবি 1.9) ব্যবহার spawn:

spawn 'sleep 1; echo one' #=> 430
spawn 'echo two' #=> 431
sleep 2
# This program will print "two\none".

এই পদ্ধতিটি প্রক্রিয়াটি প্রস্থান হওয়ার জন্য অপেক্ষা করে না এবং পিআইডি ফিরিয়ে দেয়।


e। ব্যবহার IO.popen:

io = IO.popen 'cat', 'r+'
$stdout = io
puts 'hi'
$stdout = IO.new 0
p io.read(1)
io.close
# prints '"h"'.

এই পদ্ধতিটি এমন কোনও IOবস্তু ফেরত দেবে যা নতুন প্রক্রিয়াগুলির ইনপুট / আউটপুট পুনরাবৃত্তি করে। প্রোগ্রামটি ইনপুট দেওয়ার জন্য এটি বর্তমানে কেবলমাত্র আমিই জানি।


চ। ব্যবহার করুন Open3(1.9.2 এবং তারপরে)

require 'open3'

stdout,stderr,status = Open3.capture3(some_command)
STDERR.puts stderr
if status.successful?
  puts stdout
else
  STDERR.puts "OH NO!"
end

Open3দুটি আউটপুট স্ট্রিমে সুস্পষ্ট অ্যাক্সেস পাওয়ার জন্য অন্যান্য বেশ কয়েকটি ফাংশন রয়েছে। এটি পপেনের মতো, তবে আপনাকে স্টাডারে অ্যাক্সেস দেয়।


বোনাস কৌতুক: io = IO.popen 'cat > out.log', 'r+'; কমান্ডের আউটপুটগুলি "আউটলগ"
লিখেছেন

4
প্রতিটি জন্য প্রো এবং কনস কি। কোনটি ব্যবহার করব তা আমি কীভাবে সিদ্ধান্ত নেব? FileUtils[ রুবি-ডোক.আর.এস.এস.ডি.ডি.এল.বি .৯.৯.৩ / লিবিডোক / ফাইলেটিলস / আরডোক / ফাইল ফাইলস.চ.টি.এমএল] কীভাবে ব্যবহার করবেন ?
আভা

4
আমি এক্সিকিউটিভ ব্যবহার করে একটি এসভিএন কমান্ড চালাচ্ছি। আমি চাই না এক্সিকিউটের আউটপুট কনসোলে প্রদর্শিত হবে। আমি এটিকে পুনর্নির্দেশ করতে চাই যাতে আমি এটিকে পরিবর্তনশীল হিসাবে সঞ্চয় করতে পারি এবং এটিতে কিছু প্রক্রিয়াজাত করতে পারি। আমি এটা কিভাবে করব ?
স্ট্যাক 1

4
status.successful? আমার জন্য আর রুবি ২.৪-তে কাজ করছে না, এটি স্ট্যাটাসে পরিবর্তন হয়েছে? :)
ড্যানিয়েল

14

রুবিতে সিস্টেম কমান্ড চালানোর কয়েকটি উপায় রয়েছে।

irb(main):003:0> `date /t` # surround with backticks
=> "Thu 07/01/2010 \n"
irb(main):004:0> system("date /t") # system command (returns true/false)
Thu 07/01/2010
=> true
irb(main):005:0> %x{date /t} # %x{} wrapper
=> "Thu 07/01/2010 \n"

কিন্তু যদি আপনাকে কমান্ডের স্টিডিন / স্টডআউট দিয়ে আসলে ইনপুট এবং আউটপুট সম্পাদন করতে হয়, আপনি সম্ভবত সেই IO::popenপদ্ধতিটি দেখতে চান যা বিশেষত সেই সুবিধাটি উপলব্ধ করে।


আপনার অ্যাপ্লিকেশনটির স্ট্যান্ডার্ড না থাকলে পপেন ভাল কাজ করে। আপনার যদি আরও কথোপকথনের প্রয়োজন হয় বা স্টডআউট, স্টিডিন
পল রুবেল


2

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

প্রোগ্রামটি যদি স্ক্রিন বা ভিআই এর মতো "ফুল স্ক্রিন" মোডে কাজ করে তবে পদ্ধতির আলাদা হতে হবে। এই জাতীয় প্রোগ্রামগুলির জন্য আপনার "প্রত্যাশা" লাইব্রেরির রুবি প্রয়োগের সন্ধান করা উচিত। এটি আপনাকে স্ক্রিপ্টে যা দেখতে প্রত্যাশা করে এবং আপনি যখন নির্দিষ্ট পর্দায় স্ক্রিনে উপস্থিত দেখবেন তখন কী প্রেরণ করবেন তা স্ক্রিপ্ট করার অনুমতি দেবে।

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


রুপিতে অন্তর্নির্মিত পিটিআই মডিউলটি ব্যবহার করে প্রত্যাশার একটি সহজ সংস্করণ পাওয়া যায় ।
টিন ম্যান

0

সর্বাধিক ব্যবহৃত পদ্ধতিটি এখানে ব্যবহার Open3করা হচ্ছে কিছু সংশোধন সহ আমার কোড সম্পাদিত সংস্করণ version

require 'open3'
puts"Enter the command for execution"
some_command=gets
stdout,stderr,status = Open3.capture3(some_command)
STDERR.puts stderr
if status.success?
  puts stdout
else
  STDERR.puts "ERRRR"
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.