রুবি সিস্টেম কমান্ড চেক প্রস্থান কোড


106

নীচের মতো রুবিতে আমার কাছে প্রচুর সিস্টেম কল রয়েছে এবং আমি তাদের প্রস্থান কোডগুলি একই সাথে পরীক্ষা করতে চাই যাতে আমার স্ক্রিপ্টটি বাইরে না যায় যদি সেই আদেশটি ব্যর্থ হয়।

system("VBoxManage createvm --name test1")
system("ruby test.rb")

আমি এরকম কিছু চাই

system("VBoxManage createvm --name test1", 0) <- যেখানে দ্বিতীয় প্যারামিটারটি প্রস্থান কোডটি পরীক্ষা করে এবং নিশ্চিত করে যে সেই সিস্টেম কল সফল হয়েছিল এবং যদি তা না হয় তবে এটি ত্রুটি বাড়াবে বা এই জাতীয় কিছু করবে।

এটা কি আদৌ সম্ভব?

আমি এর লাইন ধরে কিছু চেষ্টা করেছি এবং এটিও কার্যকর হয়নি।

system("ruby test.rb")
system("echo $?")

অথবা

`ruby test.rb`
exit_code = `echo $?`
if exit_code != 0
  raise 'Exit code is not zero'
end


উপরের উদাহরণে, exit_codeএকটি স্ট্রিং হবে - হয় "0\n"বা "1\n"তাই exit_code != 0সবসময় সত্য হবে
ডিজিএমস্টুয়ার্ট

উত্তর:


166

ডকুমেন্টেশন থেকে :

trueকমান্ডটি শূন্য নয় প্রস্থান স্থিতির falseজন্য শূন্য প্রস্থান স্থিতি দিলে সিস্টেমটি ফিরে আসে । রিটার্নস nilযদি কমান্ড সঞ্চালনের ব্যর্থ।

system("unknown command")     #=> nil
system("echo foo")            #=> true
system("echo foo | grep bar") #=> false

তদ্ব্যতীত

একটি ত্রুটি স্থিতি পাওয়া যায় $?

system("VBoxManage createvm --invalid-option")

$?             #=> #<Process::Status: pid 9926 exit 2>
$?.exitstatus  #=> 2

2
এবং কীভাবে এর আউটপুট (প্রস্থান কোড নয়) একটি ভেরিয়েবলের ক্যাপচার করবেন?
ア レ ッ ク ス

আপনি যদি রেল কনসোলে থাকেন, এটি পরীক্ষা করে দেখেন, তবে মনে রাখবেন আপনি $ এর মান হারাতে পারেন? সুতরাং আপনার এটি আপনার আরপিএল কমান্ডের অংশ হিসাবে ক্যাপচার করা দরকার [10] pry(main)> system("touch /root/test 2> /dev/null") => false [11] pry(main)> $?.exitstatus => 0 [12] pry(main)> system("touch /root/test 2> /dev/null"); $?.exitstatus => 1
লার্ডকানো

systemব্যাকটিকস %xএবং execএখানে সরবরাহের আরও একটি দুর্দান্ত তুলনা : stackoverflow.com/questions/6338908/…
টম হ্যারিসন

38

আমার জন্য, আমি শেল কমান্ডগুলিতে কল করতে check use ব্যবহার পছন্দ করি $? প্রক্রিয়া স্থিতি পেতে। $? একটি প্রক্রিয়া স্থিতি অবজেক্ট, আপনি এই বস্তুটি থেকে কমান্ডের প্রক্রিয়া সম্পর্কিত তথ্য পেতে পারেন, যার মধ্যে রয়েছে: স্থিতি কোড, সম্পাদনের স্থিতি, পিড ইত্যাদি including

Useful এর কিছু কার্যকর পদ্ধতি? বস্তু:

   $?.exitstatus => return error code    
   $?.success? => return true if error code is 0, otherwise false
   $?.pid => created process pid

1
Rubocop সাহায্যে, আমি বুঝতে পারলাম যে জন্য পাঠযোগ্য ওরফে $?হয়$CHILD_STATUS
RajaRaviVarma

26

systemআয় falseকমান্ড একটি নন-জিরো প্রস্থান কোড আছে, অথবা nilযদি কোন কমান্ড।

অতএব

system( "foo" ) or exit

অথবা

system( "foo" ) or raise "Something went wrong with foo"

কাজ করা উচিত, এবং যুক্তিযুক্ত সংক্ষিপ্ত।


6

আপনি নিজের systemকলটির ফলাফল ক্যাপচার করছেন না , যেখানে ফলাফলের কোডটি ফিরে এসেছে:

exit_code = system("ruby test.rb")

প্রতিটি systemকল বা সমতুল্যর কথা মনে রাখুন , যার মধ্যে ব্যাকটিক-পদ্ধতি রয়েছে, একটি নতুন শেল তৈরি করে, সুতরাং পূর্ববর্তী শেলের পরিবেশের ফলাফলটি ধরা সম্ভব নয়। এই ক্ষেত্রে exit_codeহয় trueযদি সবকিছু কাজ করেন, nilঅন্যথায়।

popen3কমান্ড আরও নিম্ন স্তরের বিস্তারিত প্রদান করে।


2
Open3.capture3এই ধরণের টাস্কের জন্য ব্যবহার করা বিশেষত সহজ পদ্ধতি।
টিন ম্যান

6

এটি করার একটি উপায় হ'ল তাদের ব্যবহার করে চেইন করা andবা &&:

system("VBoxManage createvm --name test1") and system("ruby test.rb")

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

if ()আপনাকে কিছু ফ্লো-কন্ট্রোল দেওয়ার জন্য আপনি এগুলি মুড়িয়ে রাখতে পারেন :

if (
  system("VBoxManage createvm --name test1") && 
  system("ruby test.rb")
) 
  # do something
else
  # do something with $?
end

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