الفرق بين المراجعتين ل"Ruby/IO/popen"

من موسوعة حسوب
< Ruby‏ | IO
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: التابع <code>popen‎</code> الخاص بالصنف <code>IO</code> في روبي}}</noinclude> تصنيف: Ruby تصنيف: R...')
 
سطر 3: سطر 3:
 
[[تصنيف: Ruby Method]]
 
[[تصنيف: Ruby Method]]
 
[[تصنيف: Ruby IO]]
 
[[تصنيف: Ruby IO]]
ينفذ التابع <code>popen</code> التعليمة المعطاة (انظر فقرة البنية العامة) على شكل عملية فرعي (subprocess)؛ سيتم توصيل المدخلات والمخرجات القياسية للعملية الفرعية إلى [[Ruby/IO|مجرى د/خ]] (<code>IO</code>) المُعاد.
+
ينفذ التابع <code>popen</code> التعليمة المعطاة كعملية فرعية (subprocess)؛ مع توصيل المجرَيَين القياسيين للمدخلات والمخرجات للعملية الفرعية مع [[Ruby/IO|مجرى د/خ]] المُعاد.
  
يمكن الحصول على على معرف العملية (PID) التي بدأت عبر التابع <code>[[Ruby/IO/pid|#pid]]</code>.
+
يمكن الحصول على على معرف العملية (PID) عبر التابع <code>[[Ruby/IO/pid|pid]]</code>.
  
الوسيط <code>cmd</code> هو إما [[Ruby/String|سلسلة نصية]] أو [[Ruby/Array|مصفوفة]] كما هو موضح أدناه.
+
الوسيط <code>cmd</code> سيكون إما [[Ruby/String|سلسلة نصية]] أو [[Ruby/Array|مصفوفة]] كما هو موضح أدناه.<syntaxhighlight lang="ruby">cmd:
 +
  "-"                                    : fork
 +
  commandline                            : سلسلة نصية تُمرر إلى الصدفة
 +
  [env, cmdname, arg1, ..., opts]        : اسم التعليمة مع عدد من الوسائط بدون صدفة
 +
  [env, [cmdname, argv0], arg1, ..., opts]:مع عدد من الوسائط دون صدفةو argv[0] اسم التعليمة
 +
(اختياريان env و opts)‎</syntaxhighlight>إن كان <code>cmd</code> يساوي "<code>-</code>"، فستُشغّل نسخة (instance) جديدة من روبي كعملية فرعية.
  
<syntaxhighlight lang="ruby">cmd:
+
إن كان <code>cmd</code> عبارة عن [[Ruby/Array|مصفوفة]] من [[Ruby/String|السلاسل النصية]]، فسيتم استخدامه كعملية فرعية في <code>argv</code> بحيث يتجاوز الصدفة (shell). يمكن أن تحتوي [[Ruby/Array|المصفوفة]] على [[Ruby/Hash|قاموس]] في البداية لتحديد معطيات بيئة التشغيل، و[[Ruby/Hash|قاموس]] في الأخير لتحدبد الخيارات بشكل مشابه للتابع <code>spawn</code>.
  "-"                                      : fork
 
  commandline                              : command line string which is passed to a shell
 
  [env, cmdname, arg1, ..., opts]         : command name and zero or more arguments (no shell)
 
  [env, [cmdname, argv0], arg1, ..., opts] : command name, argv[0] and zero or more arguments (no shell)
 
(env and opts are optional.)‎</syntaxhighlight>
 
  
إن كان <code>cmd</code> يساوي <code>String</code> "<code>-</code>"، فسيتم بدء تشغيل نسخة (instance) جديدة من روبي كعملية فرعية.
+
الوضع الافتراضي [[Ruby/File|للملف]] الجديد هو "<code>r</code>"، ولكن قد يتم تعيين الوضع <code>mode</code> عند أي من الأوضاع المذكورة في وصف الصنف <code>[[Ruby/IO|IO]]</code>. ويحدد الوسيط الأخير <code>opt</code> الوضع <code>mode</code>.<syntaxhighlight lang="ruby"># set IO encoding
 +
IO.popen("nkf -e filename", :external_encoding=>"EUC-JP") {|nkf_io|
 +
  euc_jp_string = nkf_io.read
 +
}
 +
# merge standard output and standard error using
 +
# spawn option.  See the document of Kernel.spawn.
 +
IO.popen(["ls", "/", :err=>[:child, :out]]) {|ls_io|
 +
  ls_result_with_error = ls_io.read
 +
}
 +
# spawn options can be mixed with IO options
 +
IO.popen(["ls", "/"], :err=>[:child, :out]) {|ls_io|
 +
  ls_result_with_error = ls_io.read
 +
}‎</syntaxhighlight>سيُطلق الاستثناءات التي أطلقها التابعان <code>IO.pipe</code> و <code>Kernel.spawn</code>.
  
إن كان <code>cmd</code> عبارة عن [[Ruby/Array|مصفوفة]] <code>Array</code> من [[Ruby/String|السلاسل النصية]] <code>String</code>، فسيتم استخدامه كعملية فرعية في <code>argv</code> بحيث يتجاوز shell. يمكن أن تحتوي [[Ruby/Array|المصفوفة]] على [[Ruby/Hash|قاموس]] في البداية لتحديد معطيات بيئة التشغيل، و[[Ruby/Hash|قاموس]] في الأخير لتحدبد الخيارات بشك مشابه للتابع <code>spawn</code>.
+
في حال إعطاء كتلة، فستُنفذ روبي التعليمة كعملية فرعية مرتبطة بروبي عبر أنبوب (pipe). سيُمرّر الطرف المقابل لروبي كوسيط إلى الكتلة. في نهاية الكتلة، ستغلق روبي الأنبوب وتعيّن قيمة ‎<code>$?‎‎</code>. في هذه الحالة، سيعيد التابع <code>IO.popen</code> قيمة الكتلة.
  
الوضع الافتراضي لكائن [[Ruby/File|الملف]] الجديد هو "r"، ولكن قد يتم تعيين <code>mode</code> عند أي من الأوضاع المذكورة في وصف الصنف <code>[[Ruby/IO|IO]]</code>. الوسيط الأخير <code>opt</code> يؤهل <code>mode</code>.
+
في حال إعطاء كتلة، وكانت قيمة <code>cmd</code> مساوية [[Ruby/String|للسلسلة النصية]] "<code>-</code>"، فسيتم تنفيذ الكتلة في عمليتين منفصلتين: مرة في العملية الأم (parent)، ومرة ​في العملية الإبن (child). سيُمرّر الأنبوب إلى العملية الأم كوسيط إلى الكتلة، فيما سيتم تمرير القيمة <code>nil</code> إلى الكتلة المُنفّذة في العملية الإبن، وسيتم توصيل مجريا المدخلات والمخرجات القياسيين الخاصين بالعملية الإبن والعملية الأم عبر الأنبوب. هذا غير متوفر على جميع الأنظمة.
 
 
 
 
 
 
سيُطلق الاستثناءات التي أطلقتها <code>IO.pipe</code> و <code>Kernel.spawn</code>.
 
 
 
في حال إعطاء كتلة، فستُنفذ روبي التعليمة كعملية فرعية مرتبطة بروبي عبر أنبوب (pipe). سيُمرّر طرف النهاية المقابل لروبي في الأنبوب كوسيط إلى الكتلة. في نهاية الكتلة، ستغلق روبي الأنبوب وتعيّن قيمة <code>$?</code>. وفي هذه الحالة، سيعيد التابع <code>IO.popen</code> قيمة الكتلة.
 
 
 
في حال إعطاء كتلة، وكانت قيمة <code>cmd</code> مساوية [[Ruby/String|السلسلة النصية]] "<code>-</code>"، فسيتم تنفيذ الكتلة في عمليتين منفصلتين: مرة العملية الأم (parent)، ومرة ​في العملية الإبن (child). سيُمرّر الأنبوب إلى العملية الأم كوسيط إلى الكتلة، فيما سيتم تمرير القيمة <code>nil</code> إلى للكتلة المُنفّذة في العملية الإبن، وسيتم توصيل مجريا المدخلات والمخرجات القياسيين الخاصين بالعملية الإبن بالعملية الأم عبر الأنبوب. غير متوفر على جميع الأنظمة الأساسية.
 
 
 
 
 
 
 
<code>produces:</code>
 
 
 
<syntaxhighlight lang="ruby">["Linux\n"]
 
Parent is 21346
 
Thu Jan 15 22:41:19 JST 2009
 
21346 is here, f is #<IO:fd 3>
 
21352 is here, f is nil
 
#<Process::Status: pid 21352 exit 0>
 
<foo>bar;zot;‎</syntaxhighlight>
 
 
==البنية العامة==
 
==البنية العامة==
 
<syntaxhighlight lang="ruby">popen([env,] cmd, mode="r" [, opt])→ io
 
<syntaxhighlight lang="ruby">popen([env,] cmd, mode="r" [, opt])→ io
سطر 46: سطر 38:
 
==المعاملات==
 
==المعاملات==
 
===<code>env‎</code>===
 
===<code>env‎</code>===
 +
إعدادات البيئة.
 +
 
===<code>cmd‎</code>===
 
===<code>cmd‎</code>===
 +
تعليمة.
 +
 
===<code>mode‎</code>===
 
===<code>mode‎</code>===
 
الوضعية
 
الوضعية
سطر 52: سطر 48:
 
خيارات
 
خيارات
 
==القيمة المُعادة==
 
==القيمة المُعادة==
 +
يعاد [[Ruby/IO|مجرى د/خ]]  أو يعاد ناتج الكتلة البرمجية في حال تمريرها.
 +
 
==أمثلة==
 
==أمثلة==
مثال على استخدام التابع <code>popen‎</code>:
+
مثال على استخدام التابع <code>popen‎</code>:<syntaxhighlight lang="ruby">f = IO.popen("uname")
<syntaxhighlight lang="ruby"># set IO encoding
+
p f.readlines
IO.popen("nkf -e filename", :external_encoding=>"EUC-JP") {|nkf_io|
+
f.close
  euc_jp_string = nkf_io.read
+
puts "Parent is #{Process.pid}"
}
+
IO.popen("date") {|f| puts f.gets }
# merge standard output and standard error using
+
IO.popen("-") {|f| $stderr.puts "#{Process.pid} is here, f is #{f.inspect}"}
# spawn option.  See the document of Kernel.spawn.
+
p $?
IO.popen(["ls", "/", :err=>[:child, :out]]) {|ls_io|
+
IO.popen(%w"sed -e s|^|<foo>| -e s&$&;zot;&", "r+") {|f|
   ls_result_with_error = ls_io.read
+
   f.puts "bar"; f.close_write; puts f.gets
}
+
}</syntaxhighlight>الناتج:<syntaxhighlight lang="ruby">["Linux\n"]
# spawn options can be mixed with IO options
+
Parent is 21346
IO.popen(["ls", "/"], :err=>[:child, :out]) {|ls_io|
+
Thu Jan 15 22:41:19 JST 2009
  ls_result_with_error = ls_io.read
+
21346 is here, f is #<IO:fd 3>
}‎</syntaxhighlight>
+
21352 is here, f is nil
 +
#<Process::Status: pid 21352 exit 0>
 +
<foo>bar;zot;‎</syntaxhighlight>
 
==انظر أيضا==
 
==انظر أيضا==
* التابع <code>[[Ruby/IO/pipe|pipe]]</code>: ينشئ التابع <code>pipe</code> زوجًا من مداخل الأنابيب (pipe endpoints) (متصلة ببعضها البعض) ثم يعيدها على هيئة [[Ruby/Array|مصفوفة]] ثنائية من [[Ruby/IO|مجريات د/خ]] <code>IO</code>:‏ <code>[</code> <code>read_io</code> و <code>write_io</code> <code>]</code>.
+
*التابع <code>[[Ruby/IO/pipe|pipe]]</code>: ينشئ التابع <code>pipe</code> زوجًا من مداخل الأنابيب (pipe endpoints) (متصلة ببعضها البعض) ثم يعيدها على هيئة [[Ruby/Array|مصفوفة]].
* التابع <code>[[Ruby/IO/read|read]]</code>: يفتح التابع <code>read</code> الملف، ثم يتموضع اختياريا في الموضع المعطى <code>offset</code> (انظر فقرة البنية العامة)، ثم يُعيد <code>length</code> بايت (تساوي قيمته الافتراضية طول بقية الملف).  يضمن التابع <code>read</code> أن يُغلق الملف قبل العودة.
 
 
==مصادر==
 
==مصادر==
 
*[http://ruby-doc.org/core-2.5.1/IO.html#method-c-popen قسم  التابع popen‎ في الصنف IO‎ في توثيق روبي الرسمي.]
 
*[http://ruby-doc.org/core-2.5.1/IO.html#method-c-popen قسم  التابع popen‎ في الصنف IO‎ في توثيق روبي الرسمي.]

مراجعة 23:29، 12 نوفمبر 2018

ينفذ التابع popen التعليمة المعطاة كعملية فرعية (subprocess)؛ مع توصيل المجرَيَين القياسيين للمدخلات والمخرجات للعملية الفرعية مع مجرى د/خ المُعاد.

يمكن الحصول على على معرف العملية (PID) عبر التابع pid.

الوسيط cmd سيكون إما سلسلة نصية أو مصفوفة كما هو موضح أدناه.

cmd:
  "-"                                     : fork
  commandline                             : سلسلة نصية تُمرر إلى الصدفة
  [env, cmdname, arg1, ..., opts]         : اسم التعليمة مع عدد من الوسائط بدون صدفة
  [env, [cmdname, argv0], arg1, ..., opts]:مع عدد من الوسائط دون صدفةو argv[0] اسم التعليمة 
(اختياريان env و opts)

إن كان cmd يساوي "-"، فستُشغّل نسخة (instance) جديدة من روبي كعملية فرعية.

إن كان cmd عبارة عن مصفوفة من السلاسل النصية، فسيتم استخدامه كعملية فرعية في argv بحيث يتجاوز الصدفة (shell). يمكن أن تحتوي المصفوفة على قاموس في البداية لتحديد معطيات بيئة التشغيل، وقاموس في الأخير لتحدبد الخيارات بشكل مشابه للتابع spawn.

الوضع الافتراضي للملف الجديد هو "r"، ولكن قد يتم تعيين الوضع mode عند أي من الأوضاع المذكورة في وصف الصنف IO. ويحدد الوسيط الأخير opt الوضع mode.

# set IO encoding
IO.popen("nkf -e filename", :external_encoding=>"EUC-JP") {|nkf_io|
  euc_jp_string = nkf_io.read
}
# merge standard output and standard error using
# spawn option.  See the document of Kernel.spawn.
IO.popen(["ls", "/", :err=>[:child, :out]]) {|ls_io|
  ls_result_with_error = ls_io.read
}
# spawn options can be mixed with IO options
IO.popen(["ls", "/"], :err=>[:child, :out]) {|ls_io|
  ls_result_with_error = ls_io.read
}

سيُطلق الاستثناءات التي أطلقها التابعان IO.pipe و Kernel.spawn.

في حال إعطاء كتلة، فستُنفذ روبي التعليمة كعملية فرعية مرتبطة بروبي عبر أنبوب (pipe). سيُمرّر الطرف المقابل لروبي كوسيط إلى الكتلة. في نهاية الكتلة، ستغلق روبي الأنبوب وتعيّن قيمة ‎$?‎‎. في هذه الحالة، سيعيد التابع IO.popen قيمة الكتلة.

في حال إعطاء كتلة، وكانت قيمة cmd مساوية للسلسلة النصية "-"، فسيتم تنفيذ الكتلة في عمليتين منفصلتين: مرة في العملية الأم (parent)، ومرة ​في العملية الإبن (child). سيُمرّر الأنبوب إلى العملية الأم كوسيط إلى الكتلة، فيما سيتم تمرير القيمة nil إلى الكتلة المُنفّذة في العملية الإبن، وسيتم توصيل مجريا المدخلات والمخرجات القياسيين الخاصين بالعملية الإبن والعملية الأم عبر الأنبوب. هذا غير متوفر على جميع الأنظمة.

البنية العامة

popen([env,] cmd, mode="r" [, opt]) io
popen([env,] cmd, mode="r" [, opt]) {|io| block }  obj

المعاملات

env‎

إعدادات البيئة.

cmd‎

تعليمة.

mode‎

الوضعية

opt‎

خيارات

القيمة المُعادة

يعاد مجرى د/خ أو يعاد ناتج الكتلة البرمجية في حال تمريرها.

أمثلة

مثال على استخدام التابع popen‎:

f = IO.popen("uname")
p f.readlines
f.close
puts "Parent is #{Process.pid}"
IO.popen("date") {|f| puts f.gets }
IO.popen("-") {|f| $stderr.puts "#{Process.pid} is here, f is #{f.inspect}"}
p $?
IO.popen(%w"sed -e s|^|<foo>| -e s&$&;zot;&", "r+") {|f|
  f.puts "bar"; f.close_write; puts f.gets
}

الناتج:

["Linux\n"]
Parent is 21346
Thu Jan 15 22:41:19 JST 2009
21346 is here, f is #<IO:fd 3>
21352 is here, f is nil
#<Process::Status: pid 21352 exit 0>
<foo>bar;zot;

انظر أيضا

  • التابع pipe: ينشئ التابع pipe زوجًا من مداخل الأنابيب (pipe endpoints) (متصلة ببعضها البعض) ثم يعيدها على هيئة مصفوفة.

مصادر