الفرق بين المراجعتين لصفحة: «Ruby/Kernel/exec»

من موسوعة حسوب
< Ruby‏ | Kernel
ط مراجعة وتدقيق
طلا ملخص تعديل
 
(1 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة)
سطر 16: سطر 16:
|<code>exec([cmdname, argv0], arg1, ...)‎</code>
|<code>exec([cmdname, argv0], arg1, ...)‎</code>
|اسم أمر وكائن <code>argv</code>، مع إمكانية إضافة وسائط أخرى (بدون صدفة shell).
|اسم أمر وكائن <code>argv</code>، مع إمكانية إضافة وسائط أخرى (بدون صدفة shell).
|}في الشكل الأول، تؤخذ السلسلة النصية باعتبارها سطر أوامر، ثم تعمل الصدفة على بتبسيطه (expansion) قبل أن يتم تنفيذه.
|}
__TOC__
في الشكل الأول، تؤخذ السلسلة النصية باعتبارها أمرًا يراد تنفيذه في سطر أوامر، ثم تعمل الصدفة على بتبسيطه (expansion) قبل أن يتم تنفيذه.


الصدفة القياسية تعني دائمًا <code>"/bin/sh"</code> على الأنظمة المشابهة بيونكس، مثل <code>ENV["RUBYSHELL"]‎</code> (أو <code>ENV["COMSPEC"]‎</code> على منصات Windows NT)، وما شابه.
الصدفة القياسية تعني دائمًا <code>"/bin/sh"</code> على الأنظمة المشابهة بيونكس، مثل <code>ENV["RUBYSHELL"]‎</code> (أو <code>ENV["COMSPEC"]‎</code> على منصات Windows NT)، وما شابه.


في حال اتبعت السلسلة النصية من الشكل الأول (أي الشكل <code>exec("command")</code>‎) هذه القواعد البسيطة:
في حال استعملت السلسلة النصية من الشكل الأول (أي الشكل <code>exec("command")</code>‎)، فستتبع هذه القواعد البسيطة:
*ليس هنالك محارف خاصة (meta characters)، و
*ليس هنالك محارف خاصة (meta characters)، و
*لا كلمات مخصصة للصدفة أو مدمجة (built-in) فيها، و
*لا كلمات مخصصة للصدفة أو مدمجة (built-in) فيها، و
*تستدعي روبي الأمر مباشرة دون صدفة.
*تستدعي روبي الأمر مباشرة دون صدفة.
يمكنك فرض استدعاء الصدفة بإضافة "<code>؛</code>" إلى السلسلة النصية (لأن "<code>؛</code>" محرف خاص).
يمكنك فرض استدعاء الصدفة بإضافة <code>؛</code> إلى السلسلة النصية (لأن <code>؛</code> محرف خاص).


انتبه إلى أن هذا السلوك يمكن ملاحظته في كون مُعرِّف العملية (pid) الذي تم الحصول عليه (من طرف <code>spawn()‎</code> و <code>IO.pid</code> بالنسبة للتابع <code>IO.popen</code>) هو معرف العملية للأمر المستدعى، وليس للصدفة.
انتبه إلى أنَّ هذا السلوك يمكن ملاحظته في كون مُعرِّف العملية (pid) الذي تم الحصول عليه (من طرف <code>spawn()‎</code> و <code>[[Ruby/IO/pid|IO.pid]]</code> بالنسبة للتابع <code>[[Ruby/IO/popen|IO.popen]]</code>) هو معرف العملية للأمر المستدعى، وليس للصدفة.


في الشكل الثاني ‎(<code>exec("command1", "arg1",...)</code>) ‎، يتم اعتبار الوسيط الأول كاسم للأمر، أما البقية فتُمرّر كوسائط للأمر دون أن تبسُطها الصدفة.
في الشكل الثاني ‎(<code>exec("command1", "arg1",...)</code>) ‎، يتم اعتبار الوسيط الأول كاسم للأمر، أما البقية فتُمرّر كوسائط للأمر دون أن تبسُطها الصدفة.


الشكل الثالث ‎(<code>exec(["command", "argv0"],"arg1", ...)</code>)‎ يُبدأ بمصفوفة ثنائية في بداية الأمر، عنصرها الأول هو الأمر الذي سيتم تنفيذه، أما الثاني فيُستخدم كقيمة للوسيط <code>argv[0]‎</code>، والتي قد تظهر في قوائم العملية (process listings).
الشكل الثالث ‎(<code>exec(["command", "argv0"],"arg1", ...)</code>)‎ يُبدأ بمصفوفة ثنائية في بداية الأمر، عنصرها الأول هو الأمر الذي سيتم تنفيذه، أما الثاني فيُستخدم كقيمة للوسيط <code>argv[0]‎</code>، والذي قد يظهر في قوائم العملية (process listings).
==البنية العامة==
==البنية العامة==
<syntaxhighlight lang="ruby">exec([env,] command... [,options])‎</syntaxhighlight>من أجل تنفيذ الأمر <code>command</code>، ستُستخدم إحدى استدعاءات النظام <code>exec(2)‎</code>، لذلك فإنّ الأمر الجاري قد يرث بعض خصائص بيئة البرنامج الأصلي (بما في ذلك واصفات الملفات [file descriptors] المفتوحة).
<syntaxhighlight lang="ruby">exec([env,] command... [,options])‎</syntaxhighlight>من أجل تنفيذ الأمر <code>command</code>، ستُستخدم إحدى استدعاءات النظام <code>exec(2)‎</code>، لذلك فإنّ الأمر الجاري قد يرث بعض خصائص بيئة البرنامج الأصلي (بما في ذلك واصفات الملفات [file descriptors] المفتوحة).
سطر 38: سطر 40:
في حال فشل تنفيذ الأمر (عادةً الخطأ <code>Errno::ENOENT</code> عند عدم التمكن من العثور على الأمر) يتم إطلاق الاستثناء <code>[[Ruby/SystemCallError|SystemCallError]]</code>.
في حال فشل تنفيذ الأمر (عادةً الخطأ <code>Errno::ENOENT</code> عند عدم التمكن من العثور على الأمر) يتم إطلاق الاستثناء <code>[[Ruby/SystemCallError|SystemCallError]]</code>.


يعدّل التابع <code>exec</code> خصائص العملية وفقًا لقيمة الوسيط <code>options</code> قبل استدعاء النظام <code>exec(2)‎</code>. راجع صفحة التابع <code>[[Ruby/Kernel/spawn|spawn]]</code> لمزيد من التفاصيل حول الوسيط <code>options</code> المعطى.
يعدّل التابع <code>exec</code> خصائص العملية وفقًا لقيمة الوسيط <code>options</code> قبل استدعاء النظام <code>exec(2)‎</code>. راجع صفحة التابع <code>[[Ruby/Kernel/spawn|spawn]]</code> لمزيد من التفاصيل حول الوسيط <code>options</code> المعطى.


قد يُحتفظ بالخصائص المعدلة عند فشل استدعاء النظام <code>exec(2)‎</code>. على سبيل المثال، حدود الموارد الثابتة (hard resource limits) غير قابلة للاستعادة. إذا لم يناسبك هذا، فضع في بالك إنشاء عملية فرعية (child process) باستخدام <code>[[Ruby/Kernel/spawn|spawn]]</code> أو <code>[[Ruby/Kernel/system|system]]</code>.
قد يُحتفَظ بالخصائص المعدلة عند فشل استدعاء النظام <code>exec(2)‎</code>. على سبيل المثال، حدود الموارد الثابتة (hard resource limits) غير قابلة للاستعادة. إذا لم يناسبك هذا، فضع في بالك إنشاء عملية فرعية (child process) باستخدام <code>[[Ruby/Kernel/spawn|spawn]]</code> أو <code>[[Ruby/Kernel/system|system]]</code>.
==المعاملات==
==المعاملات==
===<code>env‎</code>===
===<code>env‎</code>===
يُستخدم هذا الوسيط لتعديل سلوك التابع <code>exec</code>.
يُستخدم هذا الوسيط لتعديل سلوك التابع <code>exec</code>.
===<code>command...‎</code>===
===<code>command...‎</code>===
الأمر الخارجي المعطى.
الأمر الخارجي المراد تنفيذه.
===<code>options‎</code>===
===<code>options‎</code>===
يُستخدم هذا الوسيط لتعديل سلوك التابع <code>exec</code>.
يُستخدم هذا الوسيط لتعديل سلوك التابع <code>exec</code>.

المراجعة الحالية بتاريخ 12:16، 15 نوفمبر 2018

يستبدل التابع exec العملية (process) الحالية عبر تشغيل الأمر الخارجي المعطى والذي يمكن أن يأخذ أحد الأشكال التالية:

الأمر الوصف
exec(commandline)‎ أحد أوامر سطر الأوامر (command line) والذي يُمرّر إلى الصدفة (shell) القياسية.
exec(cmdname, arg1, ...) اسم أمر (command name) ووسيط واحد أو أكثر (بدون صدفة).
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) هو معرف العملية للأمر المستدعى، وليس للصدفة.

في الشكل الثاني ‎(exec("command1", "arg1",...)) ‎، يتم اعتبار الوسيط الأول كاسم للأمر، أما البقية فتُمرّر كوسائط للأمر دون أن تبسُطها الصدفة.

الشكل الثالث ‎(exec(["command", "argv0"],"arg1", ...))‎ يُبدأ بمصفوفة ثنائية في بداية الأمر، عنصرها الأول هو الأمر الذي سيتم تنفيذه، أما الثاني فيُستخدم كقيمة للوسيط argv[0]‎، والذي قد يظهر في قوائم العملية (process listings).

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

exec([env,] command... [,options])

من أجل تنفيذ الأمر command، ستُستخدم إحدى استدعاءات النظام exec(2)‎، لذلك فإنّ الأمر الجاري قد يرث بعض خصائص بيئة البرنامج الأصلي (بما في ذلك واصفات الملفات [file descriptors] المفتوحة).

يمكن تعديل هذا السلوك عبر الوسيطين env و options. انظر التابع spawn لمزيد من التفاصيل.

في حال فشل تنفيذ الأمر (عادةً الخطأ Errno::ENOENT عند عدم التمكن من العثور على الأمر) يتم إطلاق الاستثناء SystemCallError.

يعدّل التابع exec خصائص العملية وفقًا لقيمة الوسيط options قبل استدعاء النظام exec(2)‎. راجع صفحة التابع spawn لمزيد من التفاصيل حول الوسيط options المعطى.

قد يُحتفَظ بالخصائص المعدلة عند فشل استدعاء النظام exec(2)‎. على سبيل المثال، حدود الموارد الثابتة (hard resource limits) غير قابلة للاستعادة. إذا لم يناسبك هذا، فضع في بالك إنشاء عملية فرعية (child process) باستخدام spawn أو system.

المعاملات

env‎

يُستخدم هذا الوسيط لتعديل سلوك التابع exec.

command...‎

الأمر الخارجي المراد تنفيذه.

options‎

يُستخدم هذا الوسيط لتعديل سلوك التابع exec.

أمثلة

مثال على استخدام التابع exec‎:

exec "echo *"       # echoes list of files in current directory
# never get here
exec "echo", "*"    # echoes an asterisk
# never get here

انظر أيضا

  • التابع eval: يقيم (Evaluates) التابع تعبيرات روبي الموجودة في سلاسل نصية.
  • التابع spawn: يعيد التابع أمرًا محددا ويعيد معرّفه.

مصادر