التابع Process.exec
في روبي
يستبدل التابع exec
العملية الحالية عبر تشغيل الأمر الخارجي المعطى.
البنية العامة
exec([env,] command... [,options])
يمكن أن يأخذ التابع عند استعماله لتنفيذ الأمر الخارجة المعطى أحد الأشكال التالية:
exec(commandline)
: الأمر هو سلسلة نصية تُمرَّر إلى الصدفة القياسية (standard shell).exec(cmdname, arg1, ...)
: يُمرَّر إلى التابع اسم الأمر ووسيط واحد أو أكثر (بدون صدفة).exec([cmdname, argv0], arg1, ...)
: يُمرَّر إلى التابع اسم الأمر والوسيطargv
فقط أو وسيط آخر أو أكثر (بدون صدفة).
في الشكل الأول، تُؤخذ السلسلة النصية كسطر أمري يخضع إلى توسعة الصدفة (shell expansion) قبل تنفيذه.
الصدفة القياسية تعني "/bin/sh" دومًا في الأنظمة الشبيهة بيونكس مثل ENV["RUBYSHELL"]
(أو ENV["COMSPEC"]
على أنظمة ويندوز NT) وما شابه.
إن تبعت السلسلة النصية في الشكل الأول (exec("command")
) القاعدتين التاليتين:
- عدم وجود محارف خاصة (meta characters).
- عدم وجود كلمات محجوزة خاصة بالصدفة أو كلمات خاصة مضمَّنة.
فيمكن إجبار استدعاء الصدفة عبر إضافة فاصلة منقوطة ";" إلى السلسلة النصية (لأن ";" يعدُّ محرفًا خاصًّا).
انتبه إلى أنَّ هذا السلوك يمكن رؤيته عبر مُعرِّف العملية pid الذي سبق الحصول عليه (القيمة المعادة من spawn()
و IO.pid
من أجل IO.popen
) للأمر المستدعى وليس للصدفة.
في الشكل الثاني (exec("command1", "arg1", ...)
)، يُؤخَذ المعامل الأول على أنَّه اسم أمرٍ وبقية المعاملات المُمرَّرة على أنَّها معاملات يراد تمريرها إلى الأمر بدون توسعة الصدفة.
في الشكل الثالث (exec(["command", "argv0"], "arg1", ...)
)، يُمرَّر بداية إلى التابع مصفوفة بعنصرين الأول هو الأمر المراد تنفيذه والثاني يُستعمَل على أنَّه القيمة argv[0]
التي قد تظهر في قوائم العملية.
من أجل تنفيذ الأمر، تُستخدَم إحدى دالتي النظام exec(2)
؛ لذلك، قد يرث الأمر الذي يجري تنفيذه بعض متغيرات البيئة للبرنامج الأصلي (من ضمنها واصفات الملفات المفتوحة). يُعدَّل هذا السلوك عبر المعاملين env
والمعامل options
. اطلع على توثيق التابع spawn
لمزيد من التفاصيل.
إن فشل تنفيذ الأمر (حدوث الخطأ Errno::ENOENT
عادةً عندما لا يُعثَر عليه)، يُطلَق الاستثناء SystemCallError
.
الخاصيات المُعدَّلة قد يُحافَظ عليها عند فشل دالة النظام exec(2). ولكن، على سبيل المثال، قيود مورد صلب (hard resource limits) غير قابلة للاستعادة.
خذ في حسبانك بإنشاء عملية ابن باستعمال التابع spawn
أو Kernel.system
إن كان ذلك غير مقبول.
المعاملات
env
متغيرات البيئة المراد تعديلها وضبطها من أجل الأمر المراد تنفيذه.
command
الأمر المراد تنفيذه.
options
خيارات تُستعمَل لتعديل خاصيات العملية قبل استدعاء النظام exec(2)
. اطلع على التابع spawn
للمزيد من التفاصيل حول المعامل options
.
أمثلة
مثال على استعمال التابع exec
:
exec "echo *" # اظهار قائمة الملفات في المجلد الحالي
# never get here
exec "echo", "*" # * اظهار الرمز
# never get here
انظر أيضًا
- التابع
egid
: يعيد مُعرِّف المجموعة الفعال (effective group ID) المالكة لهذه العملية. - التابع
fork
: ينشئ عملية فرعية.