الفرق بين المراجعتين لصفحة: «Ruby/Kernel/exec»
لا ملخص تعديل |
جميل-بيلوني (نقاش | مساهمات) طلا ملخص تعديل |
||
(2 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة) | |||
سطر 3: | سطر 3: | ||
[[تصنيف: Ruby Method]] | [[تصنيف: Ruby Method]] | ||
[[تصنيف: Ruby Kernel]] | [[تصنيف: Ruby Kernel]] | ||
يستبدل التابع <code>exec</code> العملية (process) الحالية عبر تشغيل الأمر الخارجي المعطى | يستبدل التابع <code>exec</code> العملية (process) الحالية عبر تشغيل الأمر الخارجي المعطى والذي يمكن أن يأخذ أحد الأشكال التالية: | ||
{| class="wikitable" | {| class="wikitable" | ||
!الأمر | |||
!الوصف | |||
|- | |||
|<code>exec(commandline)</code> | |<code>exec(commandline)</code> | ||
| | |أحد أوامر سطر الأوامر (command line) والذي يُمرّر إلى الصدفة (shell) القياسية. | ||
|- | |- | ||
|<code>exec(cmdname, arg1, ...)</code> | |<code>exec(cmdname, arg1, ...)</code> | ||
|اسم أمر (command name) ووسيط واحد أو أكثر (بدون صدفة). | |اسم أمر (command name) ووسيط واحد أو أكثر (بدون صدفة). | ||
|- | |- | ||
|<code>exec([cmdname, argv0], arg1, ...)</code> | |<code>exec([cmdname, argv0], arg1, ...)</code> | ||
|اسم أمر وكائن <code>argv</code>، مع إمكانية إضافة وسائط أخرى (بدون صدفة shell). | |||
|اسم أمر | |||
|} | |} | ||
في الشكل | __TOC__ | ||
في الشكل الأول، تؤخذ السلسلة النصية باعتبارها أمرًا يراد تنفيذه في سطر أوامر، ثم تعمل الصدفة على بتبسيطه (expansion) قبل أن يتم تنفيذه. | |||
الصدفة القياسية تعني دائمًا <code>"/bin/sh"</code> على الأنظمة المشابهة | الصدفة القياسية تعني دائمًا <code>"/bin/sh"</code> على الأنظمة المشابهة بيونكس، مثل <code>ENV["RUBYSHELL"]</code> (أو <code>ENV["COMSPEC"]</code> على منصات Windows NT)، وما شابه. | ||
في حال | في حال استعملت السلسلة النصية من الشكل الأول (أي الشكل <code>exec("command")</code>)، فستتبع هذه القواعد البسيطة: | ||
* | *ليس هنالك محارف خاصة (meta characters)، و | ||
* | *لا كلمات مخصصة للصدفة أو مدمجة (built-in) فيها، و | ||
* تستدعي روبي الأمر مباشرة دون صدفة | *تستدعي روبي الأمر مباشرة دون صدفة. | ||
يمكنك فرض استدعاء الصدفة بإضافة | يمكنك فرض استدعاء الصدفة بإضافة <code>؛</code> إلى السلسلة النصية (لأن <code>؛</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). | |||
==البنية العامة== | |||
من أجل تنفيذ | <syntaxhighlight lang="ruby">exec([env,] command... [,options])</syntaxhighlight>من أجل تنفيذ الأمر <code>command</code>، ستُستخدم إحدى استدعاءات النظام <code>exec(2)</code>، لذلك فإنّ الأمر الجاري قد يرث بعض خصائص بيئة البرنامج الأصلي (بما في ذلك واصفات الملفات [file descriptors] المفتوحة). | ||
يمكن تعديل هذا السلوك عبر الوسيطين <code>env</code> و <code>options</code>. انظر التابع <code>[[Ruby/Kernel/spawn|spawn]]</code> لمزيد من التفاصيل. | يمكن تعديل هذا السلوك عبر الوسيطين <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>. | ||
==المعاملات== | ==المعاملات== | ||
===<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>. | ||
سطر 62: | سطر 59: | ||
*التابع <code>[[Ruby/Kernel/spawn|spawn]]</code>: يعيد التابع أمرًا محددا ويعيد معرّفه. | *التابع <code>[[Ruby/Kernel/spawn|spawn]]</code>: يعيد التابع أمرًا محددا ويعيد معرّفه. | ||
==مصادر== | ==مصادر== | ||
*[http://ruby-doc.org/core-2.5.1/Kernel.html#method-i-exec قسم | *[http://ruby-doc.org/core-2.5.1/Kernel.html#method-i-exec قسم التابع exec في الصنف Kernel في توثيق روبي الرسمي.] |
المراجعة الحالية بتاريخ 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
: يعيد التابع أمرًا محددا ويعيد معرّفه.