التابع exec
الخاص بالصنف Kernel
في روبي
يستبدل التابع العملية الحالية عن طريق تشغيل الأمر الخارجي المعطى، والذي يمكن أن يأخذ أحد الأشكال التالية:
exec(commandline)
سطر أوامر نصي shell exec(cmdname, arg1, ...)
والذي يُمرّر إلى الصدفة (shell) القياسية، اسم أمر ووسيط واحد أو أكثر (بدون صدفة) اسم أمر و exec([cmdname, argv0], arg1, ...)
و argv
أو وسائط أكثر (بدون shell)
في الشكل الأول ، تؤخذ السلسلة النصية باعتبارها سطر أوامر والذي تثوم الصدفة بتسبطُيه (expansion ) قبل أن يتم تنفيذه.
الصدفة القياسية تعني دائمًا "/bin/sh"
على الأنظمة المشابهة ليونكس، مثل ENV["RUBYSHELL"]
(أو ENV["COMSPEC"]
على منصات Windows NT ) ، وما شابه.
إذا اتبعت السلسلة النصية من الشكل الأول (exec("command")
) هذه القواعد البسيطة:
لا أحرف مميزة (meta characters)، ولا كلمات مخصصة للصدفة أو مدمجة (built-in) ستستدعي روبي الأمر مباشرة دون صدفة
يمكنك إلزام استدعاء الصدفة بإضافة "؛" إلى السلسلة النصية (لأن "؛" حرف مميز).
لاحظ أن هذا السلوك يمكن ملاحظته في كون معرف العملية pid الذي تم الحصول عليه (القيمة المعادة من spawn () و IO#pid
لـ IO.popen
) هو معرف العملية pid للأمر المستدعى، وليس الصدفة .
في الشكل الثاني (exec("command1", "arg1",
...)
) ، يتم اعتبار الأول كاسم للأمر، أما البقية فتُمرّر كوسائط للأمر دون أن تبسطها الصدفة.
في الشكل الثالث (exec(["command", "argv0"],
"arg1", ...)
) ، يُبدأ بمصفوفة ثنائية في بداية الأمر، العنصر الأول هو الأمر الذي سيتم تنفيذه، أما الثاني فيُستخدم باعتباره قيمة argv[0]
، والتي قد تظهر في قوائم العملية (process listings).
من أجل تنفيذ الأمر، ستُستخدم إحدى استدعاءات النظام exec(2)
، لذلك فإنّ الأمر الجاري قد يرث بعض خصائص بيئة البرنامج الأصلي (بما في ذلك واصفات الملفات المفتوحة).
يمكن تعديل هذا السلوك عبر الوسيطين env
و options
. انظر ::spawn لمزيد من التفاصيل.
في حال فشل تنفيذ الأمر (عادةً عند عدم التمكن من إيجاد Errno::ENOENT
) يتم إطلاق استثناء SystemCallError
.
بعدل التابع خصائص العملية وفقا لقيمة الوسيط options
قبل استدعاء النظام exec(2)
. راجع ::spawn لمزيد من التفاصيل حول options
المعطى.
قد يُحتفظ بالخصائص المعدلة عند فشل استدعاء النظام exec(2)
.
على سبيل المثال، حدود الموارد الثابتة (hard resource limits) غير قابلة للاستعادة.
إذا لم يناسلبك هذا، فضع في اعتبارك إنشاء عملية فرعية (child process) باستخدام :: spawn أو #system
.
البنية العامة
exec([env,] command... [,options])
المعاملات
env
command...
options
القيمة المُعادة
أمثلة
مثال على استخدام التابع exec
:
exec "echo *" # echoes list of files in current directory
# never get here
exec "echo", "*" # echoes an asterisk
# never get here
انظر أيضا
- التابع
eval
: يقيم (Evaluates) التابع تعبيرات روبي الموجودة في سلاسل نصية. إذا أعطي الوسيط binding، والذي يجب أن يكون من النوعBinding
، فسيُجرى التقييم في السياق الخاص بها. في حال تمرير الوسيطين الاختياريين filename و lineno، فسيُستخدمان عند الإبلاغ عن أخطاء في الصياغة. - التابع
exit
: يبدأ التابع عملية إنهاء البرنامج النصي لروبي، عن طريق إطلاق استثناءSystemExit
. من الممكن أن يتم احتواء هذا الاستثناء. يُستخدم الوسيط الاختياري لإعادة رمز الحالة (status code) لبيئة الاستدعاء. تشير الحالتانtrue
وFALSE
إلى النجاح والفشل على التوالي. يعتمد تفسير قيم الأعداد الأخرى على النظام المُستخدم.