التابع popen
الخاص بالصنف IO
في روبي
ينفذ التابع popen
التعليمة المعطاة (انظر فقرة البنية العامة) على شكل عملية فرعي (subprocess)؛ سيتم توصيل المدخلات والمخرجات القياسية للعملية الفرعية إلى مجرى د/خ (IO
) المُعاد.
يمكن الحصول على على معرف العملية (PID) التي بدأت عبر التابع #pid
.
الوسيط cmd
هو إما سلسلة نصية أو مصفوفة كما هو موضح أدناه.
cmd:
"-" : 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.)
إن كان cmd
يساوي String
"-
"، فسيتم بدء تشغيل نسخة (instance) جديدة من روبي كعملية فرعية.
إن كان cmd
عبارة عن مصفوفة Array
من السلاسل النصية String
، فسيتم استخدامه كعملية فرعية في argv
بحيث يتجاوز shell. يمكن أن تحتوي المصفوفة على قاموس في البداية لتحديد معطيات بيئة التشغيل، وقاموس في الأخير لتحدبد الخيارات بشك مشابه للتابع spawn
.
الوضع الافتراضي لكائن الملف الجديد هو "r"، ولكن قد يتم تعيين mode
عند أي من الأوضاع المذكورة في وصف الصنف IO
. الوسيط الأخير opt
يؤهل mode
.
سيُطلق الاستثناءات التي أطلقتها IO.pipe
و Kernel.spawn
.
في حال إعطاء كتلة، فستُنفذ روبي التعليمة كعملية فرعية مرتبطة بروبي عبر أنبوب (pipe). سيُمرّر طرف النهاية المقابل لروبي في الأنبوب كوسيط إلى الكتلة. في نهاية الكتلة، ستغلق روبي الأنبوب وتعيّن قيمة $?
. وفي هذه الحالة، سيعيد التابع IO.popen
قيمة الكتلة.
في حال إعطاء كتلة، وكانت قيمة cmd
مساوية السلسلة النصية "-
"، فسيتم تنفيذ الكتلة في عمليتين منفصلتين: مرة العملية الأم (parent)، ومرة في العملية الإبن (child). سيُمرّر الأنبوب إلى العملية الأم كوسيط إلى الكتلة، فيما سيتم تمرير القيمة nil
إلى للكتلة المُنفّذة في العملية الإبن، وسيتم توصيل مجريا المدخلات والمخرجات القياسيين الخاصين بالعملية الإبن بالعملية الأم عبر الأنبوب. غير متوفر على جميع الأنظمة الأساسية.
produces:
["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([env,] cmd, mode="r" [, opt])→ io
popen([env,] cmd, mode="r" [, opt]) {|io| block } → obj
المعاملات
env
cmd
mode
الوضعية
opt
خيارات
القيمة المُعادة
أمثلة
مثال على استخدام التابع 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
}
انظر أيضا
- التابع
pipe
: ينشئ التابعpipe
زوجًا من مداخل الأنابيب (pipe endpoints) (متصلة ببعضها البعض) ثم يعيدها على هيئة مصفوفة ثنائية من مجريات د/خIO
:[
read_io
وwrite_io
]
. - التابع
read
: يفتح التابعread
الملف، ثم يتموضع اختياريا في الموضع المعطىoffset
(انظر فقرة البنية العامة)، ثم يُعيدlength
بايت (تساوي قيمته الافتراضية طول بقية الملف). يضمن التابعread
أن يُغلق الملف قبل العودة.