কিভাবে রুবি থেকে শেল কমান্ড কল করতে হয়


1076

আমি রুবি প্রোগ্রামের ভিতর থেকে শেল কমান্ডগুলি কীভাবে কল করব? আমি কীভাবে এই আদেশগুলি থেকে রুবিতে ফিরে আউটপুট পেতে পারি?


3
যদিও এই প্রশ্নটি কার্যকর, এটি ভাল জিজ্ঞাসা করা হয়নি। রুবির সাব-শেলগুলি কল করার অনেকগুলি উপায় রয়েছে যা কার্নেল এবং ওপেন 3 নথি পড়ে এবং এসওতে এখানে অনুসন্ধান করে ভাল ডকুমেন্টেড এবং সহজেই পাওয়া যায় ।
টিন ম্যান

1
দুঃখের বিষয় এই বিষয়টি বেশ জটিল। Open3( ডক্স ) সবচেয়ে পরিস্থিতিতে, আইএমও কিন্তু রুবি পুরোনো সংস্করণের উপর জন্য সবচেয়ে ভাল পছন্দ, এটা সম্মান করবে না একটি পরিবর্তিত PATH( bugs.ruby-lang.org/issues/8004 ), এবং কিভাবে আপনি args পাস উপর নির্ভর করে (বিশেষত , যদি আপনি নন-কীওয়ার্ড সহ অপটস হ্যাশ ব্যবহার করেন) তবে এটি ভেঙে যেতে পারে। তবে, যদি আপনি এই পরিস্থিতিতে আঘাত করেন তবে আপনি বেশ উন্নত কিছু করছেন এবং এর বাস্তবায়ন পড়ে আপনি কী করতে পারেন তা নির্ধারণ করতে পারেন Open3
জোশুয়া গাল

3
আমি অবাক হয়েছি কেউ উল্লেখ করেনি Shellwords.escape( ডক ) আপনি সরাসরি শেল কমান্ডগুলিতে ব্যবহারকারী-ইনপুট beোকাতে চান না - প্রথমে এটি এড়িয়ে চলুন! আরও দেখুন কমান্ড ইনজেকশন
কেলভিন

উত্তর:


1318

এই ব্যাখ্যাটি আমার এক বন্ধুর কাছ থেকে মন্তব্য করা রুবি স্ক্রিপ্টের ভিত্তিতে । আপনি যদি স্ক্রিপ্টটি উন্নত করতে চান তবে লিঙ্কে এটি আপডেট করে নির্দ্বিধায়।

প্রথমে নোট করুন যে রুবি যখন শেল ডাকে তখন সাধারণত এটি ডাকে /bin/sh, বাশকে নয় । কিছু ব্যাশ সিনট্যাক্স /bin/shসমস্ত সিস্টেমে সমর্থিত নয় ।

এখানে একটি শেল স্ক্রিপ্ট কার্যকর করার উপায়গুলি:

cmd = "echo 'hi'" # Sample string that can be used
  1. Kernel#` , সাধারণত ব্যাকটিক্স বলা হয় - `cmd`

    এটি বাশ, পিএইচপি এবং পার্ল সহ অন্যান্য অনেক ভাষার মতো।

    শেল কমান্ডের ফলাফল (অর্থাত্ স্ট্যান্ডার্ড আউটপুট) প্রদান করে।

    দস্তাবেজ: http://ruby-doc.org/core/Kernel.html#method-i-60

    value = `echo 'hi'`
    value = `#{cmd}`
  2. অন্তর্নির্মিত বাক্য গঠন, %x( cmd )

    xচরিত্রটি অনুসরণ করা একটি সীমানা নির্ধারণকারী, যা কোনও চরিত্র হতে পারে। তাহলে বিভেদক অক্ষর এক (, [, {, অথবা <, আক্ষরিক অক্ষরের ম্যাচিং ক্লোজিং বিভেদক পর্যন্ত, গঠিত নেস্টেড বিভেদক যুগলের দ্রুত হিসাব গ্রহণ। অন্যান্য সমস্ত ডিলিমিটারের জন্য আক্ষরিক অক্ষরে অক্ষরের অক্ষরের পরবর্তী উপস্থিতি পর্যন্ত অক্ষর থাকে। স্ট্রিং ইন্টারপোলেশন #{ ... }অনুমোদিত।

    ব্যাকটিক্সের মতো শেল কমান্ডের ফলাফল (অর্থাত্ স্ট্যান্ডার্ড আউটপুট) প্রদান করে।

    দস্তাবেজ: https://docs.ruby-lang.org/en/master/syntax/literals_rdoc.html#label- পার্সেন্ট+ স্ট্রিংস

    value = %x( echo 'hi' )
    value = %x[ #{cmd} ]
  3. Kernel#system

    সাব-শেলের মধ্যে প্রদত্ত কমান্ড কার্যকর করে।

    রিটার্নস trueযদি কমান্ড পাওয়া যায় এবং করা হয় সফলভাবে চালানোর জন্য, falseঅন্যথায়।

    দস্তাবেজ: http://ruby-doc.org/core/Kernel.html#method-i- সিস্টেম

    wasGood = system( "echo 'hi'" )
    wasGood = system( cmd )
  4. Kernel#exec

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

    কিছুই প্রত্যাবর্তন করে না, বর্তমান প্রক্রিয়া প্রতিস্থাপন করা হয় এবং কখনও অব্যাহত থাকে না।

    দস্তাবেজ: http://ruby-doc.org/core/Kernel.html#method-i-exec

    exec( "echo 'hi'" )
    exec( cmd ) # Note: this will never be reached because of the line above

এখানে কিছু অতিরিক্ত পরামর্শ দেওয়া হয়েছে: $?যা $CHILD_STATUSআপনি ব্যাকটিকগুলি ব্যবহার করেন, system()বা যদি শেষ পদ্ধতিটি কার্যকর করা কমান্ডের স্থিতি অ্যাক্সেস করে %x{}। তারপরে আপনি এগুলি exitstatusএবং pidবৈশিষ্ট্যগুলি অ্যাক্সেস করতে পারেন :

$?.exitstatus

আরও পড়ার জন্য দেখুন:


4
প্রোডাকশন সার্ভারে আমার এক্সিকিউটেবলের আউটপুটগুলি লগ করতে হবে তবে কোনও উপায় খুঁজে পাওয়া যায়নি। আমি পুটস #{cmd}এবং লগার #{cmd}. info ( ) ব্যবহার করেছি । উত্পাদনে তাদের আউটপুটগুলি লগ করার কোনও উপায় আছে কি?
ওমর আসলাম

5
এবং আইও # পপেন () এবং ওপেন 3 # পপেন 3 ()। mentalized.net/journal/2010/03/08/...
hughdbrown

6
সম্পূর্ণতার স্বার্থে (যেমন আমি প্রথম ভেবেছিলাম এটিও রুবি কমান্ড হবে): রেক করেছে যা "সিস্টেম কমান্ডটি চালায় does cmdএকাধিক যুক্তি যদি শেল দিয়ে দেওয়া না হয় (কার্নেল হিসাবে একই শব্দার্থক ::) এক্সিকিউট এবং কার্নেল :: সিস্টেম) "।
স্কুবার্থ

40
ব্যাকটিকগুলি ডিফল্টরূপে STDERR ক্যাপচার করে না। আপনি ক্যাপচার করতে চাইলে কমান্ড দিতে `2> & 1` যুক্ত করুন
আন্দ্রেই বোতালভ

14
আমি মনে করি এই উত্তরটি কিছুটা উন্নত হবে যদি এটি যদি বলে যে ব্যাকটিকস এবং% x প্রদত্ত আদেশের "ফলাফল" এর পরিবর্তে "আউটপুট" ফিরিয়ে দিয়েছে। দ্বিতীয়টি প্রস্থান স্থিতির জন্য ভুল হতে পারে। নাকি শুধু আমার?
স্কেজেডাল

274

24
বাহ হা হা। যদিও এটি বিদ্যমান ছিল তা দুর্ভাগ্যজনক হলেও খুব দরকারী
জোশ বোদাহ

পার্শ্ব নোট হিসাবে, আমি স্প্যান () পদ্ধতিটি বিভিন্ন জায়গায় পাওয়া যায় (যেমন Kernelএবং Processসর্বাধিক বহুমুখী। এটি কম-বেশি একইরকম PTY.spawn(), তবে আরও জেনেরিক
স্মার

160

আমি যেভাবে এটি করতে পছন্দ করি তা হ'ল %xআক্ষরিক ব্যবহার , যা একটি কমান্ডে উদ্ধৃতি ব্যবহার করা সহজ (এবং পাঠযোগ্য!) করে:

directorylist = %x[find . -name '*test.rb' | sort]

যা, এই ক্ষেত্রে, বর্তমান ডিরেক্টরিতে সমস্ত পরীক্ষা ফাইলের সাথে ফাইলের তালিকা তৈরি করবে, যা আপনি প্রত্যাশা অনুযায়ী প্রক্রিয়া করতে পারেন:

directorylist.each do |filename|
  filename.chomp!
  # work with file
end

4
আপনাকে কি %x[ cmd ]একটি অ্যারে ফেরত দেয়?
এক্স-ইউরি

2
উপরেরটি আমার পক্ষে কাজ করে না। ? `<main> ': অপরিবর্তিত পদ্ধতিটি each' for :String (NoMethodError) কীভাবে এটি আপনার পক্ষে কাজ করে? আমি ব্যবহার করছি ruby -v ruby 1.9.3p484 (2013-11-22 revision 43786) [i686-linux]আপনি কি নিশ্চিত যে কমান্ড থেকে একটি অ্যারে ফিরে এসেছে যাতে লুপটি আসলে কাজ করবে?
নাসের

% x [সেন্টিমিটার] .স্প্লিট ("\ n") তবে তালিকা ফিরিয়ে দেবে :)
ইয়ান এলিস

65

এখানে রুবিতে শেল স্ক্রিপ্টগুলি চালানো সম্পর্কে আমার মতে সেরা নিবন্ধটি রয়েছে: "রুবিতে শেল কমান্ডগুলি চালানোর 6 উপায় "।

আপনার যদি প্রয়োজন হয় তবে আউটপুট ব্যাকটিক্স ব্যবহার করুন।

আমার আরও উন্নত স্টাফ যেমন STDOUT এবং STDERR এর প্রয়োজন ছিল তাই আমি ওপেন 4 রত্নটি ব্যবহার করেছি। সমস্ত পদ্ধতি আপনি সেখানে ব্যাখ্যা করেছেন।


2
এখানে বর্ণিত পোস্টটি %xসিনট্যাক্স বিকল্পটি নিয়ে আলোচনা করে না ।
মেই

ওপেন 4 এর জন্য +1। আমি spawnযখন এটি পেয়েছি তখনই আমি এর নিজস্ব পদ্ধতির নিজস্ব সংস্করণটি প্রয়োগ করার চেষ্টা শুরু করেছি।
ব্র্যান্ডান

40

আমার প্রিয় ওপেন 3

  require "open3"

  Open3.popen3('nroff -man') { |stdin, stdout, stderr| ... }

2
আমিও open3, বিশেষ করে Open3.capture3 মত: ruby-doc.org/stdlib-1.9.3/libdoc/open3/rdoc/... -> stdout, stderr, status = Open3.capture3('nroff -man', :stdin_data => stdin)
Severin

ওপেন 3, বা অন্য ওপেনের সাথে রুবি এসটিডি-লিবিতে কীভাবে স্পেক এবং ইউনিট পরীক্ষা করা যায় সে সম্পর্কে কোনও দলিল আছে? আমার বর্তমান উপলব্ধির স্তরে শেল আউট পরীক্ষা করা শক্ত।
ফিলবট 3

29

এই প্রক্রিয়াগুলির মধ্যে নির্বাচন করার সময় কিছু বিষয় চিন্তা করা উচিত:

  1. আপনি কি কেবল স্টডআউট চান বা আপনার পাশাপাশি স্ট্যাডারও দরকার? নাকি আলাদা হয়ে গেছে?
  2. আপনার আউটপুট কত বড়? আপনি কি পুরো ফলাফলটিকে স্মৃতিতে ধরে রাখতে চান?
  3. সাব-প্রসেসটি এখনও চলমান অবস্থায় আপনি কি আপনার কিছু আউটপুট পড়তে চান?
  4. আপনার কি ফলাফলের কোড দরকার?
  5. আপনার কি কোনও রুবি অবজেক্ট দরকার যা প্রক্রিয়াটি উপস্থাপন করে এবং আপনাকে চাহিদা অনুযায়ী হত্যা করতে দেয়?

আপনার সাধারণ ব্যাকটিকগুলি (``) system(), এবং IO.popenসম্পূর্ণরূপে প্রস্ফুটিত Kernel.fork/ এবং এর Kernel.execসাথে কিছু হতে পারে ।IO.pipeIO.select

কোনও উপ-প্রক্রিয়াটি কার্যকর হতে খুব বেশি সময় নিলে আপনি মিশ্রণে টাইমআউটগুলি ফেলে দিতেও পারেন।

দুর্ভাগ্যক্রমে, এটি অনেকটাই নির্ভর করে


25

আরও একটি বিকল্প:

যখন তুমি:

  • স্ট্যাডারের পাশাপাশি স্টাডআউটও দরকার
  • ওপেন 3 / ওপেন 4 ব্যবহার করতে পারবেন না / ব্যবহার করবেন না (তারা আমার ম্যাকের নেটবিনে ব্যতিক্রম ছুঁড়ে মারবে, কেন জানি না)

আপনি শেল পুনঃনির্দেশ ব্যবহার করতে পারেন:

puts %x[cat bogus.txt].inspect
  => ""

puts %x[cat bogus.txt 2>&1].inspect
  => "cat: bogus.txt: No such file or directory\n"

2>&1সিনট্যাক্স জুড়ে কাজ লিনাক্স , Mac এবং উইন্ডোজ সিস্টেমের MS-DOS প্রথম দিন থেকে।


25

আমি অবশ্যই রুবি বিশেষজ্ঞ নই, তবে আমি এটির শট দেব:

$ irb 
system "echo Hi"
Hi
=> true

আপনার মতো জিনিসগুলি করতে সক্ষম হওয়া উচিত:

cmd = 'ls'
system(cmd)

21

উপরে উত্তর ইতিমধ্যে বেশ মহান, কিন্তু আমি সত্যিই নিম্নলিখিত সারসংক্ষেপ নিবন্ধ শেয়ার করতে চাই: " রুবি চালান শেল কমান্ড 6 উপায় "

মূলত, এটি আমাদের বলে:

Kernel#exec:

exec 'echo "hello $HOSTNAME"'

systemএবং $?:

system 'false' 
puts $?

ব্যাকটিক্স (`):

today = `date`

IO#popen:

IO.popen("date") { |f| puts f.gets }

Open3#popen3 - স্টাডলিব:

require "open3"
stdin, stdout, stderr = Open3.popen3('dc') 

Open4#popen4 -- একটি রত্ন:

require "open4" 
pid, stdin, stdout, stderr = Open4::popen4 "false" # => [26327, #<IO:0x6dff24>, #<IO:0x6dfee8>, #<IO:0x6dfe84>]

15

আপনার যদি সত্যই বাশের দরকার হয় তবে "সেরা" উত্তরের নোট অনুযায়ী।

প্রথমে নোট করুন যে রুবি যখন শেল ডাকে তখন সাধারণত এটি ডাকে /bin/sh, বাশকে নয় । কিছু ব্যাশ সিনট্যাক্স /bin/shসমস্ত সিস্টেমে সমর্থিত নয় ।

আপনার যদি বাশ ব্যবহারের প্রয়োজন হয় তবে bash -c "your Bash-only command"আপনার পছন্দসই কলিং পদ্ধতির ভিতরে প্রবেশ করুন :

quick_output = system("ls -la")
quick_bash = system("bash -c 'ls -la'")

পরীক্ষা করার জন্য:

system("echo $SHELL")
system('bash -c "echo $SHELL"')

অথবা আপনি যদি বিদ্যমান স্ক্রিপ্ট ফাইলটি চালাচ্ছেন

script_output = system("./my_script.sh")

রুবির শিবাংকে সম্মান জানানো উচিত তবে আপনি সর্বদা ব্যবহার করতে পারবেন

system("bash ./my_script.sh")

নিশ্চিত করার জন্য, যদিও /bin/shদৌড়ানো থেকে সামান্য ওভারহেড থাকতে পারে তবে /bin/bashআপনি সম্ভবত লক্ষ্য করবেন না।


11

আপনি পার্লের মতো ব্যাকটিক অপারেটর (`) ব্যবহার করতে পারেন:

directoryListing = `ls /`
puts directoryListing # prints the contents of the root directory

সহজ কিছু আপনার প্রয়োজন হলে হ্যান্ড।

আপনি কোন পদ্ধতিটি ব্যবহার করতে চান তার উপর নির্ভর করে আপনি ঠিক কী অর্জন করতে চাইছেন; বিভিন্ন পদ্ধতি সম্পর্কে আরও বিশদ জানতে ডক্স পরীক্ষা করুন।


10

আমরা একাধিক উপায়ে এটি অর্জন করতে পারি।

ব্যবহার করে Kernel#exec, এই আদেশটি কার্যকর হওয়ার পরে কিছুই নেই:

exec('ls ~')

ব্যবহার backticks or %x

`ls ~`
=> "Applications\nDesktop\nDocuments"
%x(ls ~)
=> "Applications\nDesktop\nDocuments"

Kernel#systemকমান্ড ব্যবহার করে , trueসফল হলে ফিরে আসে , falseযদি ব্যর্থ হয় এবং nilকমান্ড কার্যকর করা ব্যর্থ হলে ফিরে আসে :

system('ls ~')
=> true


9

এখানে উত্তরগুলি ব্যবহার করে এবং মিহাইয়ের উত্তরের সাথে সংযুক্ত করে আমি একটি ফাংশন একসাথে রেখেছি যা এই প্রয়োজনীয়তাগুলি পূরণ করে:

  1. পরিষ্কারভাবে STDOUT এবং STDERR কে ক্যাপচার করে তাই যখন আমার স্ক্রিপ্টটি কনসোল থেকে চালানো হয় তখন তারা "ফুটো" না করে।
  2. অ্যারে হিসাবে শেলটিতে তর্কগুলি পাস করার অনুমতি দেয়, তাই পালানোর বিষয়ে চিন্তা করার দরকার নেই।
  3. কমান্ডের প্রস্থান স্থিতি ক্যাপচার করে তাই কোনও ত্রুটি ঘটলে তা স্পষ্ট হয়।

বোনাস হিসাবে, এটি শেল কমান্ড সফলভাবে (0) প্রস্থান করে এবং STDOUT- তে কিছু রাখে এমন ক্ষেত্রে STDOUT ফিরিয়ে দেবে। এই পদ্ধতিতে, এটি এর থেকে পৃথক হয় system, যা কেবল trueএ জাতীয় ক্ষেত্রে ফিরে আসে ।

কোড অনুসরণ। নির্দিষ্ট ফাংশনটি হ'ল system_quietly:

require 'open3'

class ShellError < StandardError; end

#actual function:
def system_quietly(*cmd)
  exit_status=nil
  err=nil
  out=nil
  Open3.popen3(*cmd) do |stdin, stdout, stderr, wait_thread|
    err = stderr.gets(nil)
    out = stdout.gets(nil)
    [stdin, stdout, stderr].each{|stream| stream.send('close')}
    exit_status = wait_thread.value
  end
  if exit_status.to_i > 0
    err = err.chomp if err
    raise ShellError, err
  elsif out
    return out.chomp
  else
    return true
  end
end

#calling it:
begin
  puts system_quietly('which', 'ruby')
rescue ShellError
  abort "Looks like you don't have the `ruby` command. Odd."
end

#output: => "/Users/me/.rvm/rubies/ruby-1.9.2-p136/bin/ruby"

9

spawnনির্দিষ্ট কমান্ডটি কার্যকর করতে একটি পটভূমি প্রক্রিয়া তৈরি করার কমান্ডটি ভুলে যাবেন না । Processক্লাস এবং রিটার্ন ব্যবহার করে আপনি এর সমাপ্তির জন্য এমনকি অপেক্ষা করতে পারেন pid:

pid = spawn("tar xf ruby-2.0.0-p195.tar.bz2")
Process.wait pid

pid = spawn(RbConfig.ruby, "-eputs'Hello, world!'")
Process.wait pid

দস্তাবেজ বলেছেন: এই পদ্ধতিটি অনুরূপ #systemতবে কমান্ডটি শেষ হওয়ার জন্য এটি অপেক্ষা করে না।


2
Kernel.spawn()অন্যান্য বিকল্পগুলির চেয়ে অনেক বেশি বহুমুখী বলে মনে হচ্ছে।
কাশ্যপ

6

আপনার যদি সাধারণ মামলার চেয়ে বেশি জটিল কেসটি হ্যান্ডেল করা যায় না ``, তবে দেখুন Kernel.spawn()। বাহ্যিক কমান্ড কার্যকর করতে এটি স্ট্যান্ড রুবি দ্বারা সরবরাহ করা সবচেয়ে সাধারণ / পূর্ণ-বৈশিষ্ট্যযুক্ত বলে মনে হয়।

আপনি এটি ব্যবহার করতে পারেন:

  • প্রক্রিয়া গ্রুপ তৈরি করুন (উইন্ডোজ)।
  • ফাইলগুলি / একে অপরকে ত্রুটি পুনঃনির্দেশিত, আউট করা।
  • env vars সেট করুন, umask।
  • কমান্ড কার্যকর করার আগে ডিরেক্টরি পরিবর্তন করুন।
  • সিপিইউ / ডেটা / ইত্যাদির জন্য সংস্থান সীমা নির্ধারণ করুন।
  • অন্যান্য উত্তরের সাথে অন্য বিকল্পগুলির সাহায্যে করা যেতে পারে এমন সমস্ত কিছু করুন, তবে আরও কোড সহ।

রুবি ডকুমেন্টেশন যথেষ্ট উদাহরণ রয়েছে:

env: hash
  name => val : set the environment variable
  name => nil : unset the environment variable
command...:
  commandline                 : command line string which is passed to the standard shell
  cmdname, arg1, ...          : command name and one or more arguments (no shell)
  [cmdname, argv0], arg1, ... : command name, argv[0] and zero or more arguments (no shell)
options: hash
  clearing environment variables:
    :unsetenv_others => true   : clear environment variables except specified by env
    :unsetenv_others => false  : dont clear (default)
  process group:
    :pgroup => true or 0 : make a new process group
    :pgroup => pgid      : join to specified process group
    :pgroup => nil       : dont change the process group (default)
  create new process group: Windows only
    :new_pgroup => true  : the new process is the root process of a new process group
    :new_pgroup => false : dont create a new process group (default)
  resource limit: resourcename is core, cpu, data, etc.  See Process.setrlimit.
    :rlimit_resourcename => limit
    :rlimit_resourcename => [cur_limit, max_limit]
  current directory:
    :chdir => str
  umask:
    :umask => int
  redirection:
    key:
      FD              : single file descriptor in child process
      [FD, FD, ...]   : multiple file descriptor in child process
    value:
      FD                        : redirect to the file descriptor in parent process
      string                    : redirect to file with open(string, "r" or "w")
      [string]                  : redirect to file with open(string, File::RDONLY)
      [string, open_mode]       : redirect to file with open(string, open_mode, 0644)
      [string, open_mode, perm] : redirect to file with open(string, open_mode, perm)
      [:child, FD]              : redirect to the redirected file descriptor
      :close                    : close the file descriptor in child process
    FD is one of follows
      :in     : the file descriptor 0 which is the standard input
      :out    : the file descriptor 1 which is the standard output
      :err    : the file descriptor 2 which is the standard error
      integer : the file descriptor of specified the integer
      io      : the file descriptor specified as io.fileno
  file descriptor inheritance: close non-redirected non-standard fds (3, 4, 5, ...) or not
    :close_others => false : inherit fds (default for system and exec)
    :close_others => true  : dont inherit (default for spawn and IO.popen)

6

ব্যাকটিক্স (`) পদ্ধতিটি রুবি থেকে শেল কমান্ড কল করা সবচেয়ে সহজ। এটি শেল কমান্ডের ফলাফল প্রদান করে:

     url_request = 'http://google.com'
     result_of_shell_command = `curl #{url_request}`

5

একটি কমান্ড দেওয়া হয়েছে attrib:

require 'open3'

a="attrib"
Open3.popen3(a) do |stdin, stdout, stderr|
  puts stdout.read
end

আমি খুঁজে পেয়েছি যে এই পদ্ধতিটি তেমন স্মরণীয় নয়

system("thecommand")

অথবা

`thecommand`

ব্যাকটিক্সে, অন্যান্য পদ্ধতির তুলনায় এই পদ্ধতির একটি ভাল জিনিস ব্যাকটিক্স মনে হয় না যে আমি putsযে কমান্ডটি চালাতে চাইছি সেই কমান্ডটি চালাতে / সঞ্চয় করতে পারি এবং system("thecommand")এটি আমাকে আউটপুট পেতে দেয় বলে মনে হয় না whereas এই পদ্ধতিটি আমাকে সেই দুটি জিনিসই করতে দেয় এবং এটি আমাকে স্টিডিন, স্টাডআউট এবং স্টাডারকে স্বাধীনভাবে অ্যাক্সেস করতে দেয়।

" রুবিতে আদেশগুলি কার্যকর করা " এবং রুবির ওপেন 3 নথি দেখুন


3

এটি সত্যই কোনও উত্তর নয় তবে সম্ভবত কেউ এটির কাজে লাগবে:

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

এটি এড়াতে আপনি ব্যবহার করতে পারেন:

WIN32OLE.new('Shell.Application').ShellExecute('ipconfig > log.txt','','','open',0)

অথবা

WIN32OLE.new('WScript.Shell').Run('ipconfig > log.txt',0,0)

উভয়ই ipconfigআউটপুটটি ভিতরে রাখে log.txt, তবে কোনও উইন্ডো আসবে না।

require 'win32ole'আপনার স্ক্রিপ্টের ভিতরে আপনার প্রয়োজন হবে ।

system(), exec()এবং spawn()সমস্ত টি কে এবং রুবিউ ব্যবহার করার সময় সেই বিরক্তিকর উইন্ডোটি পপ আপ করবে।


-2

ওএস এক্স-এর রুবি স্ক্রিপ্টে আমি এখানে দুর্দান্ত একটি ব্যবহার করছি (যাতে আমি একটি স্ক্রিপ্ট শুরু করতে পারি এবং উইন্ডো থেকে টগল করার পরেও একটি আপডেট পেতে পারি):

cmd = %Q|osascript -e 'display notification "Server was reset" with title "Posted Update"'|
system ( cmd )
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.