الفرق بين المراجعتين ل"Ruby/Kernel/exec"
(أنشأ الصفحة ب'<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> | + | {| class="wikitable" |
− | في الشكل الأول ، تؤخذ السلسلة النصية باعتبارها سطر | + | |<code>exec(commandline)</code> |
− | الصدفة القياسية تعني دائمًا <code>"/bin/sh"</code> على الأنظمة المشابهة ليونكس، مثل <code>ENV["RUBYSHELL"]</code> (أو <code>ENV["COMSPEC"]</code> على منصات Windows NT ) ، وما شابه. | + | |- |
− | + | |سطر أوامر نصي والذي يُمرّر إلى الصدفة (shell) القياسية. | |
− | لا أحرف مميزة (meta characters)، ولا كلمات مخصصة للصدفة أو مدمجة (built-in) | + | |- |
− | يمكنك | + | |<code>exec(cmdname, arg1, ...)</code> |
− | لاحظ أن هذا السلوك يمكن ملاحظته في كون معرف العملية pid الذي تم الحصول عليه ( | + | |- |
− | في الشكل الثاني (<code>exec("command1", "arg1", | + | |اسم أمر (command name) ووسيط واحد أو أكثر (بدون صدفة). |
− | ...)</code>) | + | |- |
− | في الشكل الثالث (<code>exec(["command", "argv0"], | + | |<code>exec([cmdname, argv0], arg1, ...)</code> |
− | "arg1", ...)</code>) ، يُبدأ بمصفوفة ثنائية في بداية الأمر، | + | |- |
− | من أجل تنفيذ الأمر، ستُستخدم إحدى استدعاءات النظام <code>exec(2)</code>، لذلك فإنّ الأمر الجاري قد يرث بعض خصائص بيئة البرنامج الأصلي (بما في ذلك واصفات الملفات المفتوحة). | + | |اسم أمر وكائن <code>argv</code>، مع إمكانية إضافة وسائط أخرى (بدون صدفة shell) |
− | يمكن تعديل هذا السلوك عبر الوسيطين <code>env</code> و <code>options</code>. انظر | + | |} |
− | في حال فشل تنفيذ الأمر (عادةً عند عدم التمكن من إيجاد <code>Errno::ENOENT</code>) يتم إطلاق استثناء <code>SystemCallError</code>. | + | في الشكل الأول ، تؤخذ السلسلة النصية باعتبارها سطر أوامر، والذي تقوم الصدفة بتبسيطه (expansion ) قبل أن يتم تنفيذه. |
− | + | ||
− | قد يُحتفظ بالخصائص المعدلة عند فشل استدعاء النظام <code>exec(2)</code>. | + | الصدفة القياسية تعني دائمًا <code>"/bin/sh"</code> على الأنظمة المشابهة ليونكس، مثل <code>ENV["RUBYSHELL"]</code> (أو <code>ENV["COMSPEC"]</code> على منصات Windows NT)، وما شابه. |
− | على سبيل المثال، حدود الموارد الثابتة (hard resource limits) غير قابلة للاستعادة. | + | |
− | إذا لم يناسلبك هذا، فضع في اعتبارك إنشاء عملية فرعية (child process) باستخدام | + | في حال اتبعت السلسلة النصية من الشكل الأول (<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> |
− | |||
==انظر أيضا== | ==انظر أيضا== | ||
− | * التابع <code>[[Ruby/Kernel/eval|eval]]</code>: يقيم (Evaluates) التابع تعبيرات روبي الموجودة في سلاسل نصية | + | *التابع <code>[[Ruby/Kernel/eval|eval]]</code>: يقيم (Evaluates) التابع تعبيرات روبي الموجودة في سلاسل نصية. |
− | * | + | *التابع <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
: يعيد التابع أمرًا محددا ويعيد معرّفه.