الفرق بين المراجعتين ل"Ruby/Kernel/exec"

من موسوعة حسوب
< Ruby‏ | Kernel
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: التابع <code>exec‎</code> الخاص بالصنف <code>Kernel</code> في روبي}}</noinclude> تصنيف: Ruby تصنيف...')
 
سطر 3: سطر 3:
 
[[تصنيف: Ruby Method]]
 
[[تصنيف: Ruby Method]]
 
[[تصنيف: Ruby Kernel]]
 
[[تصنيف: Ruby Kernel]]
يستبدل التابع العملية الحالية عن طريق تشغيل الأمر الخارجي المعطى، والذي يمكن أن يأخذ أحد الأشكال التالية:
+
يستبدل التابع <code>exec</code> العملية (process) الحالية عبر تشغيل الأمر الخارجي المعطى <code>command</code>  (انظر فقرة البنية العامة)، والذي يمكن أن يأخذ أحد الأشكال التالية:
<code>exec(commandline)</code> سطر أوامر نصي shell <code>exec(cmdname, arg1, ...)</code> والذي يُمرّر إلى الصدفة (shell) القياسية، اسم أمر ووسيط واحد أو أكثر (بدون صدفة) اسم أمر و <code>exec([cmdname, argv0], arg1, ...)</code> و <code>argv</code> أو وسائط أكثر (بدون shell)  
+
{| class="wikitable"
في الشكل الأول ، تؤخذ السلسلة النصية باعتبارها سطر أوامر والذي تثوم الصدفة بتسبطُيه (expansion ) قبل أن يتم تنفيذه.
+
|<code>exec(commandline)</code>
الصدفة القياسية تعني دائمًا <code>"/bin/sh"</code> على الأنظمة المشابهة ليونكس، مثل <code>ENV["RUBYSHELL"]</code> (أو <code>ENV["COMSPEC"]</code> على منصات Windows NT ) ، وما شابه.
+
|-
إذا اتبعت السلسلة النصية من الشكل الأول (<code>exec("command")</code>) هذه القواعد البسيطة:
+
|سطر أوامر نصي والذي يُمرّر إلى الصدفة (shell) القياسية.
لا أحرف مميزة (meta characters)، ولا كلمات مخصصة للصدفة أو مدمجة (built-in) ستستدعي روبي الأمر مباشرة دون صدفة  
+
|-
يمكنك إلزام استدعاء الصدفة بإضافة "؛" إلى السلسلة النصية (لأن "؛" حرف مميز).
+
|<code>exec(cmdname, arg1, ...)</code>
لاحظ أن هذا السلوك يمكن ملاحظته في كون معرف العملية pid الذي تم الحصول عليه (القيمة المعادة من spawn () و <code>IO#pid</code> لـ <code>IO.popen</code>) هو معرف العملية pid للأمر المستدعى، وليس الصدفة .
+
|-
في الشكل الثاني (<code>exec("command1", "arg1",
+
|اسم أمر (command name) ووسيط واحد أو أكثر (بدون صدفة).
...)</code>) ، يتم اعتبار الأول كاسم للأمر، أما البقية فتُمرّر كوسائط للأمر دون أن تبسطها الصدفة.
+
|-
في الشكل الثالث (<code>exec(["command", "argv0"],
+
|<code>exec([cmdname, argv0], arg1, ...)</code>
"arg1", ...)</code>) ، يُبدأ بمصفوفة ثنائية في بداية الأمر، العنصر الأول هو الأمر الذي سيتم تنفيذه، أما الثاني فيُستخدم باعتباره قيمة <code>argv[0]</code>، والتي قد تظهر في قوائم العملية (process listings).
+
|-
من أجل تنفيذ الأمر، ستُستخدم إحدى استدعاءات النظام <code>exec(2)</code>، لذلك فإنّ الأمر الجاري قد يرث بعض خصائص بيئة البرنامج الأصلي (بما في ذلك واصفات الملفات المفتوحة).
+
|اسم أمر  وكائن <code>argv</code>، مع إمكانية إضافة وسائط أخرى (بدون صدفة shell)
يمكن تعديل هذا السلوك عبر الوسيطين <code>env</code> و <code>options</code>. انظر ::spawn لمزيد من التفاصيل.
+
|}
في حال فشل تنفيذ الأمر (عادةً عند عدم التمكن من إيجاد <code>Errno::ENOENT</code>) يتم إطلاق استثناء <code>SystemCallError</code>.
+
في الشكل الأول ، تؤخذ السلسلة النصية باعتبارها سطر أوامر، والذي تقوم الصدفة بتبسيطه (expansion ) قبل أن يتم تنفيذه.
بعدل التابع خصائص العملية وفقا لقيمة الوسيط <code>options</code> قبل استدعاء النظام <code>exec(2)</code>. راجع ::spawn لمزيد من التفاصيل حول <code>options</code> المعطى.
+
 
قد يُحتفظ بالخصائص المعدلة عند فشل استدعاء النظام <code>exec(2)</code>.
+
الصدفة القياسية تعني دائمًا <code>"/bin/sh"</code> على الأنظمة المشابهة ليونكس، مثل <code>ENV["RUBYSHELL"]</code> (أو <code>ENV["COMSPEC"]</code> على منصات Windows NT)، وما شابه.
على سبيل المثال، حدود الموارد الثابتة (hard resource limits) غير قابلة للاستعادة.
+
 
إذا لم يناسلبك هذا، فضع في اعتبارك إنشاء عملية فرعية (child process) باستخدام :: spawn أو <code>#system</code>.
+
في حال اتبعت السلسلة النصية من الشكل الأول (<code>exec("command")</code>)هذه القواعد البسيطة:
 +
* لا أحرف مميزة (meta characters)،
 +
* ولا كلمات مخصصة للصدفة أو مدمجة (built-in)
 +
* تستدعي روبي الأمر مباشرة دون صدفة
 +
يمكنك فرض استدعاء الصدفة بإضافة "<code>؛</code>" إلى السلسلة النصية (لأن "<code>؛</code>" حرف مميز).
 +
 
 +
لاحظ أن هذا السلوك يمكن ملاحظته في كون معرف العملية (pid) الذي تم الحصول عليه ( من طرف <code>spawn()‎</code> و <code>IO#pid</code> بالنسبة لـ<code>IO.popen</code>) هو معرف العملية للأمر المستدعى، وليس للصدفة.
 +
 
 +
في الشكل الثاني (<code>exec("command1", "arg1",...)</code>) ‎، يتم اعتبار الوسيط الأول كاسم للأمر، أما البقية فتُمرّر كوسائط للأمر دون أن تبسُطها الصدفة.
 +
 
 +
في الشكل الثالث (<code>exec(["command", "argv0"],"arg1", ...)</code>)، يُبدأ بمصفوفة ثنائية في بداية الأمر، عنصرها الأول هو الأمر الذي سيتم تنفيذه، أما الثاني فيُستخدم كقيمة لـ <code>argv[0]</code>، والتي قد تظهر في قوائم العملية (process listings).
 +
 
 +
من أجل تنفيذ الأمر، ستُستخدم إحدى استدعاءات النظام <code>exec(2)</code>، لذلك فإنّ الأمر الجاري قد يرث بعض خصائص بيئة البرنامج الأصلي (بما في ذلك واصفات الملفات [file descriptors] المفتوحة).
 +
 
 +
يمكن تعديل هذا السلوك عبر الوسيطين <code>env</code> و <code>options</code>. انظر التابع <code>[[Ruby/Kernel/spawn|spawn]]</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(2)</code>. على سبيل المثال، حدود الموارد الثابتة (hard resource limits) غير قابلة للاستعادة. إذا لم يناسلبك هذا، فضع في اعتبارك إنشاء عملية فرعية (child process) باستخدام <code>[[Ruby/Kernel/spawn|spawn]]</code> أو <code>[[Ruby/Kernel/system|system]]</code>.
 
==البنية العامة==
 
==البنية العامة==
 
<syntaxhighlight lang="ruby">exec([env,] command... [,options])‎</syntaxhighlight>
 
<syntaxhighlight lang="ruby">exec([env,] command... [,options])‎</syntaxhighlight>
 
==المعاملات==
 
==المعاملات==
 
===<code>env‎</code>===
 
===<code>env‎</code>===
 +
يُستخدم هذا الوسيط لتعديل سلوك التابع <code>exec</code>.
  
 
===<code>command...‎</code>===
 
===<code>command...‎</code>===
 +
الأمر الخارجي المعطى.
  
 
===<code>options‎</code>===
 
===<code>options‎</code>===
 
+
يُستخدم هذا الوسيط لتعديل سلوك التابع <code>exec</code>.
 
 
==القيمة المُعادة==
 
 
 
 
==أمثلة==
 
==أمثلة==
مثال على استخدام التابع <code>exec‎</code>:
+
مثال على استخدام التابع <code>exec‎</code>:<syntaxhighlight lang="ruby">exec "echo *"      # echoes list of files in current directory
<syntaxhighlight lang="ruby">exec "echo *"      # echoes list of files in current directory
 
 
# never get here
 
# never get here
 
exec "echo", "*"    # echoes an asterisk
 
exec "echo", "*"    # echoes an asterisk
# never get here
+
# never get here</syntaxhighlight>
</syntaxhighlight>
 
 
==انظر أيضا==
 
==انظر أيضا==
* التابع <code>[[Ruby/Kernel/eval|eval]]</code>: يقيم (Evaluates) التابع تعبيرات روبي الموجودة في سلاسل نصية. إذا أعطي الوسيط binding، والذي يجب أن يكون من النوع <code>Binding</code>، فسيُجرى التقييم في السياق الخاص بها. في حال تمرير الوسيطين الاختياريين filename و lineno، فسيُستخدمان عند الإبلاغ عن أخطاء في الصياغة.
+
*التابع <code>[[Ruby/Kernel/eval|eval]]</code>: يقيم (Evaluates) التابع تعبيرات روبي الموجودة في سلاسل نصية.
* التابع <code>[[Ruby/Kernel/exit|exit]]</code>: يبدأ التابع عملية إنهاء البرنامج النصي لروبي، عن طريق إطلاق استثناء <code>SystemExit</code>. من الممكن أن يتم احتواء هذا الاستثناء. يُستخدم الوسيط الاختياري لإعادة رمز الحالة (status code) لبيئة الاستدعاء. تشير الحالتان <code>true</code> و <code>FALSE</code> إلى النجاح والفشل على التوالي.  يعتمد تفسير قيم الأعداد الأخرى على النظام المُستخدم.
+
*التابع <code>[[Ruby/Kernel/spawn|spawn]]</code>: يعيد التابع أمرًا محددا ويعيد معرّفه.
 
 
 
==مصادر==
 
==مصادر==
 
*[http://ruby-doc.org/core-2.5.1/Kernel.html#method-i-exec قسم  التابع exec‎ في الصنف Kernel‎ في توثيق روبي الرسمي.]
 
*[http://ruby-doc.org/core-2.5.1/Kernel.html#method-i-exec قسم  التابع exec‎ في الصنف Kernel‎ في توثيق روبي الرسمي.]

مراجعة 19:37، 21 أكتوبر 2018

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

exec(commandline)‎
سطر أوامر نصي والذي يُمرّر إلى الصدفة (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(2)‎، لذلك فإنّ الأمر الجاري قد يرث بعض خصائص بيئة البرنامج الأصلي (بما في ذلك واصفات الملفات [file descriptors] المفتوحة).

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

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

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

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

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

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

المعاملات

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: يعيد التابع أمرًا محددا ويعيد معرّفه.

مصادر