الفرق بين المراجعتين ل"Ruby/IO/popen"
جميل-بيلوني (نقاش | مساهمات) ط (مراجعة وتدقيق.) |
|||
سطر 1: | سطر 1: | ||
− | <noinclude>{{DISPLAYTITLE: التابع <code>popen | + | <noinclude>{{DISPLAYTITLE: التابع <code>IO.popen</code> في روبي}}</noinclude> |
[[تصنيف: Ruby]] | [[تصنيف: Ruby]] | ||
[[تصنيف: Ruby Method]] | [[تصنيف: Ruby Method]] | ||
[[تصنيف: Ruby IO]] | [[تصنيف: Ruby IO]] | ||
− | ينفذ التابع <code>popen</code> | + | ينفذ التابع <code>popen</code> الأمر المعطى كعملية فرعية (subprocess) مع توصيل المجرَيَين القياسيين للدخل والخرج للعملية الفرعية مع المجرى [[Ruby/IO|<code>IO</code>]] المُعاد. |
يمكن الحصول على على معرف العملية (PID) عبر التابع <code>[[Ruby/IO/pid|pid]]</code>. | يمكن الحصول على على معرف العملية (PID) عبر التابع <code>[[Ruby/IO/pid|pid]]</code>. | ||
− | + | في حال إعطاء كتلة، فستُنفذ روبي التعليمة كعملية فرعية مرتبطة بروبي عبر أنبوب (pipe). سيُمرّر الطرف المقابل لروبي كوسيط إلى الكتلة. في نهاية الكتلة، ستغلق روبي الأنبوب وتعيّن قيمة <code>$?</code>. في هذه الحالة، سيعيد التابع <code>popen</code> قيمة الكتلة. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | في حال إعطاء كتلة، فستُنفذ روبي التعليمة كعملية فرعية مرتبطة بروبي عبر أنبوب (pipe). سيُمرّر الطرف المقابل لروبي كوسيط إلى الكتلة. في نهاية الكتلة، ستغلق روبي الأنبوب وتعيّن قيمة <code>$?</code>. في هذه الحالة، سيعيد التابع <code> | ||
− | |||
− | |||
==البنية العامة== | ==البنية العامة== | ||
<syntaxhighlight lang="ruby">popen([env,] cmd, mode="r" [, opt])→ io | <syntaxhighlight lang="ruby">popen([env,] cmd, mode="r" [, opt])→ io | ||
سطر 41: | سطر 16: | ||
===<code>cmd</code>=== | ===<code>cmd</code>=== | ||
− | + | الأمر المراد تنفيذه. يكون إما [[Ruby/String|سلسلة نصية]] أو [[Ruby/Array|مصفوفة]] كما هو موضح أدناه: | |
+ | * <code>"-"</code>: عملية فرعية (fork). | ||
+ | * <code>commandline</code>: سلسلة نصية تمثِّل سطر الأمر المراد تمريره إلى الصدفة. | ||
+ | * <code>[env, cmdname, arg1, ..., opts]</code>: اسم الأمر مع عدد من الوسائط (بدون صدفة [shell]). | ||
+ | * [env, [cmdname, argv0], arg1, ..., opts]: اسم الأمر و <code>[argv[0</code> مع عدد من الوسائط (دون صدفة). | ||
+ | إنَّ env و opts اختياريان. | ||
+ | |||
+ | إن كان <code>cmd</code> يساوي "<code>-</code>"، فستُشغّل نسخة (instance) جديدة من روبي كعملية فرعية. | ||
+ | |||
+ | إن كان <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>. | ||
+ | |||
+ | في حال إعطاء كتلة، وكانت قيمة المعامل <code>cmd</code> مساويةً [[Ruby/String|للسلسلة النصية]] "<code>-</code>"، فسيتم تنفيذ الكتلة في عمليتين منفصلتين: مرة في العملية الأب (parent)، ومرة في العملية الابن (child). سيُمرّر الأنبوب إلى العملية الأب كوسيط إلى الكتلة، فيما سيتم تمرير القيمة <code>nil</code> إلى الكتلة المُنفّذة في العملية الإبن، وسيتم توصيل مجريا الدخل والخرج القياسيين الخاصين بالعملية الابن والعملية الأب عبر الأنبوب. انتبه إلى أنَّ هذا الأمر غير متوفر على جميع الأنظمة. | ||
===<code>mode</code>=== | ===<code>mode</code>=== | ||
− | + | يحدد وضع الفتح [[Ruby/File|للملف]] الجديد. الوضع الافتراضي هو "<code>r</code>"، ولكن قد يتم تعيين الوضع <code>mode</code> عند أي من الأوضاع المذكورة في وصف الصنف <code>[[Ruby/IO|IO]]</code>. | |
===<code>opt</code>=== | ===<code>opt</code>=== | ||
− | + | يكافئ هذا المعامل المعامل <code>mode</code>. | |
==القيمة المُعادة== | ==القيمة المُعادة== | ||
يعاد [[Ruby/IO|مجرى د/خ]] أو يعاد ناتج الكتلة البرمجية في حال تمريرها. | يعاد [[Ruby/IO|مجرى د/خ]] أو يعاد ناتج الكتلة البرمجية في حال تمريرها. | ||
سطر 60: | سطر 46: | ||
IO.popen(%w"sed -e s|^|<foo>| -e s&$&;zot;&", "r+") {|f| | IO.popen(%w"sed -e s|^|<foo>| -e s&$&;zot;&", "r+") {|f| | ||
f.puts "bar"; f.close_write; puts f.gets | f.puts "bar"; f.close_write; puts f.gets | ||
− | }</syntaxhighlight> | + | }</syntaxhighlight>ناتج تنفيذ هذا المثال:<syntaxhighlight lang="text">["Linux\n"] |
Parent is 21346 | Parent is 21346 | ||
Thu Jan 15 22:41:19 JST 2009 | Thu Jan 15 22:41:19 JST 2009 | ||
سطر 66: | سطر 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 |
− | == | + | 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>[[Ruby/IO/pipe|IO.pipe]]</code> و <code>[[Ruby/Kernel/spawn|Kernel.spawn]]</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 قسم | + | *[http://ruby-doc.org/core-2.5.1/IO.html#method-c-popen قسم التابع popen في الصنف IO في توثيق روبي الرسمي.] |
مراجعة 14:02، 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
.
القيمة المُعادة
يعاد مجرى د/خ أو يعاد ناتج الكتلة البرمجية في حال تمريرها.
أمثلة
مثال على استخدام التابع 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).