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

من موسوعة حسوب
< Ruby‏ | IO
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: التابع <code>popen‎</code> الخاص بالصنف <code>IO</code> في روبي}}</noinclude> تصنيف: Ruby تصنيف: R...')
 
 
(مراجعتان متوسطتان بواسطة مستخدمين اثنين آخرين غير معروضتين)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE: التابع <code>popen‎</code> الخاص بالصنف <code>IO</code> في روبي}}</noinclude>
+
<noinclude>{{DISPLAYTITLE: التابع <code>IO.popen‎</code> في روبي}}</noinclude>
 
[[تصنيف: Ruby]]
 
[[تصنيف: Ruby]]
 
[[تصنيف: Ruby Method]]
 
[[تصنيف: Ruby Method]]
 
[[تصنيف: Ruby IO]]
 
[[تصنيف: Ruby IO]]
ينفذ التابع <code>popen</code> التعليمة المعطاة (انظر فقرة البنية العامة) على شكل عملية فرعي (subprocess)؛ سيتم توصيل المدخلات والمخرجات القياسية للعملية الفرعية إلى [[Ruby/IO|مجرى د/خ]] (<code>IO</code>) المُعاد.
+
ينفذ التابع <code>popen</code> الأمر المعطى كعملية فرعية (subprocess) مع توصيل المجرَيَين القياسيين للدخل والخرج للعملية الفرعية مع المجرى [[Ruby/IO|<code>IO</code>]] المُعاد.
  
يمكن الحصول على على معرف العملية (PID) التي بدأت عبر التابع <code>[[Ruby/IO/pid|#pid]]</code>.
+
يمكن الحصول على على معرف العملية (PID) عبر التابع <code>[[Ruby/IO/pid|pid]]</code>.
  
الوسيط <code>cmd</code> هو إما [[Ruby/String|سلسلة نصية]] أو [[Ruby/Array|مصفوفة]] كما هو موضح أدناه.
+
في حال إعطاء كتلة، فستُنفذ روبي التعليمة كعملية فرعية مرتبطة بروبي عبر أنبوب (pipe). سيُمرّر الطرف المقابل لروبي كوسيط إلى الكتلة. في نهاية الكتلة، ستغلق روبي الأنبوب وتعيّن قيمة ‎<code>$?‎‎</code>. في هذه الحالة، سيعيد التابع <code>popen</code> قيمة الكتلة.
 +
==البنية العامة==
 +
<syntaxhighlight lang="ruby">popen([env,] cmd, mode="r" [, opt])→ io
 +
popen([env,] cmd, mode="r" [, opt]) {|io| block } → obj‎</syntaxhighlight>
 +
==المعاملات==
 +
===<code>env‎</code>===
 +
إعدادات البيئة.
  
<syntaxhighlight lang="ruby">cmd:
+
===<code>cmd‎</code>===
  "-"                                     : fork
+
الأمر المراد تنفيذه. يكون إما [[Ruby/String|سلسلة نصية]] أو [[Ruby/Array|مصفوفة]] كما هو موضح أدناه:
  commandline                             : command line string which is passed to a shell
+
* <code>"-"</code>: عملية فرعية (fork).
  [env, cmdname, arg1, ..., opts]         : command name and zero or more arguments (no shell)
+
* <code>commandline</code>: سلسلة نصية تمثِّل سطر الأمر المراد تمريره إلى الصدفة.
  [env, [cmdname, argv0], arg1, ..., opts] : command name, argv[0] and zero or more arguments (no shell)
+
* <code>[env, cmdname, arg1, ..., opts]</code>: اسم الأمر مع عدد من الوسائط (بدون صدفة [shell]).
(env and opts are optional.)</syntaxhighlight>
+
* [env, [cmdname, argv0], arg1, ..., opts]: اسم الأمر و <code>[argv[0</code> مع عدد من الوسائط (دون صدفة).
 +
إنَّ env و opts اختياريان.‎
  
إن كان <code>cmd</code> يساوي <code>String</code> "<code>-</code>"، فسيتم بدء تشغيل نسخة (instance) جديدة من روبي كعملية فرعية.
+
إن كان <code>cmd</code> يساوي "<code>-</code>"، فستُشغّل نسخة (instance) جديدة من روبي كعملية فرعية.
  
إن كان <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>.
+
إن كان <code>cmd</code> عبارة عن [[Ruby/Array|مصفوفة]] من [[Ruby/String|السلاسل النصية]]، فسيتم استخدامه كعملية فرعية في <code>argv</code> بحيث يتجاوز الصدفة (shell). يمكن أن تحتوي [[Ruby/Array|المصفوفة]] على [[Ruby/Hash|جدول Hash]] في البداية لتحديد معطيات بيئة التشغيل، و<nowiki/>[[Ruby/Hash|جدول Hash]] في النهاية لتحديد الخيارات بشكل مشابه للتابع <code>[[Ruby/Kernel/spawn|spawn]]</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>mode‎</code>===
 +
يحدد وضع الفتح [[Ruby/File|للملف]] الجديد. الوضع الافتراضي هو "<code>r</code>"، ولكن قد يتم تعيين الوضع <code>mode</code> عند أي من الأوضاع المذكورة في وصف الصنف <code>[[Ruby/IO|IO]]</code>.
 +
===<code>opt‎</code>===
 +
يكافئ هذا المعامل المعامل <code>mode</code>.
 +
==القيمة المعادة==
 +
يعاد المجرى <code>[[Ruby/IO|IO]]</code> أو يعاد ناتج تنفيذ الكتلة البرمجية في حال تمريرها.
  
 
+
==أمثلة==
سيُطلق الاستثناءات التي أطلقتها <code>IO.pipe</code> و <code>Kernel.spawn</code>.
+
مثال على استخدام التابع <code>popen‎</code>:<syntaxhighlight lang="ruby">f = IO.popen("uname")
 
+
p f.readlines
في حال إعطاء كتلة، فستُنفذ روبي التعليمة كعملية فرعية مرتبطة بروبي عبر أنبوب (pipe). سيُمرّر طرف النهاية المقابل لروبي في الأنبوب كوسيط إلى الكتلة. في نهاية الكتلة، ستغلق روبي الأنبوب وتعيّن قيمة <code>$?</code>. وفي هذه الحالة، سيعيد التابع <code>IO.popen</code> قيمة الكتلة.
+
f.close
 
+
puts "Parent is #{Process.pid}"
في حال إعطاء كتلة، وكانت قيمة <code>cmd</code> مساوية [[Ruby/String|السلسلة النصية]] "<code>-</code>"، فسيتم تنفيذ الكتلة في عمليتين منفصلتين: مرة العملية الأم (parent)، ومرة ​في العملية الإبن (child). سيُمرّر الأنبوب إلى العملية الأم كوسيط إلى الكتلة، فيما سيتم تمرير القيمة <code>nil</code> إلى للكتلة المُنفّذة في العملية الإبن، وسيتم توصيل مجريا المدخلات والمخرجات القياسيين الخاصين بالعملية الإبن بالعملية الأم عبر الأنبوب. غير متوفر على جميع الأنظمة الأساسية.
+
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|
<code>produces:</code>
+
  f.puts "bar"; f.close_write; puts f.gets
 
+
}</syntaxhighlight>ناتج تنفيذ هذا المثال:<syntaxhighlight lang="text">["Linux\n"]
<syntaxhighlight lang="ruby">["Linux\n"]
 
 
Parent is 21346
 
Parent is 21346
 
Thu Jan 15 22:41:19 JST 2009
 
Thu Jan 15 22:41:19 JST 2009
سطر 40: سطر 52:
 
21352 is here, f is nil
 
21352 is here, f is nil
 
#<Process::Status: pid 21352 exit 0>
 
#<Process::Status: pid 21352 exit 0>
<foo>bar;zot;‎</syntaxhighlight>
+
<foo>bar;zot;‎</syntaxhighlight>أمثلة أخرى على استعمال التابع <code>popen</code> مع تمرير عدة خيارات إليه:<syntaxhighlight lang="ruby"># set IO encoding
==البنية العامة==
 
<syntaxhighlight lang="ruby">popen([env,] cmd, mode="r" [, opt])→ io
 
popen([env,] cmd, mode="r" [, opt]) {|io| block } → obj‎</syntaxhighlight>
 
==المعاملات==
 
===<code>env‎</code>===
 
===<code>cmd‎</code>===
 
===<code>mode‎</code>===
 
الوضعية
 
===<code>opt‎</code>===
 
خيارات
 
==القيمة المُعادة==
 
==أمثلة==
 
مثال على استخدام التابع <code>popen‎</code>:
 
<syntaxhighlight lang="ruby"># set IO encoding
 
 
IO.popen("nkf -e filename", :external_encoding=>"EUC-JP") {|nkf_io|
 
IO.popen("nkf -e filename", :external_encoding=>"EUC-JP") {|nkf_io|
 
   euc_jp_string = nkf_io.read
 
   euc_jp_string = nkf_io.read
سطر 66: سطر 64:
 
IO.popen(["ls", "/"], :err=>[:child, :out]) {|ls_io|
 
IO.popen(["ls", "/"], :err=>[:child, :out]) {|ls_io|
 
   ls_result_with_error = ls_io.read
 
   ls_result_with_error = ls_io.read
}‎</syntaxhighlight>
+
}‎</syntaxhighlight>سيُطلق الاستثناءات التي أطلقها التابعان <code>[[Ruby/IO/pipe|IO.pipe]]</code> و <code>[[Ruby/Kernel/spawn|Kernel.spawn]]</code>.
==انظر أيضا==
+
 
* التابع <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/read|read]]</code>: يفتح التابع <code>read</code> الملف، ثم يتموضع اختياريا في الموضع المعطى <code>offset</code> (انظر فقرة البنية العامة)، ثم يُعيد <code>length</code> بايت (تساوي قيمته الافتراضية طول بقية الملف).  يضمن التابع <code>read</code> أن يُغلق الملف قبل العودة.
+
*التابع <code>[[Ruby/IO/pipe|pipe]]</code>: ينشئ زوجًا من طرفي أنبوب (pipe endpoints) متصلين ببعضهما بعضًا ثم يعيدهما على هيئة [[Ruby/Array|مصفوفة]] من الكائنات <code>IO</code>.
 +
*التابع <code>[[Ruby/Kernel/spawn|Kernel.spawn]]</code>: ينفذ تعليمة محددة، ثم يعيد معرفها (pid).
 
==مصادر==
 
==مصادر==
*[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‎ في توثيق روبي الرسمي.]

المراجعة الحالية بتاريخ 14:04، 19 ديسمبر 2018

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

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

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

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

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

المعاملات

env‎

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

cmd‎

الأمر المراد تنفيذه. يكون إما سلسلة نصية أو مصفوفة كما هو موضح أدناه:

  • "-": عملية فرعية (fork).
  • commandline: سلسلة نصية تمثِّل سطر الأمر المراد تمريره إلى الصدفة.
  • [env, cmdname, arg1, ..., opts]: اسم الأمر مع عدد من الوسائط (بدون صدفة [shell]).
  • [env, [cmdname, argv0], arg1, ..., opts]: اسم الأمر و [argv[0 مع عدد من الوسائط (دون صدفة).

إنَّ env و opts اختياريان.‎

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

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

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

mode‎

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

opt‎

يكافئ هذا المعامل المعامل mode.

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

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

أمثلة

مثال على استخدام التابع 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;‎

أمثلة أخرى على استعمال التابع popen مع تمرير عدة خيارات إليه:

# 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: ينشئ زوجًا من طرفي أنبوب (pipe endpoints) متصلين ببعضهما بعضًا ثم يعيدهما على هيئة مصفوفة من الكائنات IO.
  • التابع Kernel.spawn: ينفذ تعليمة محددة، ثم يعيد معرفها (pid).

مصادر