getopts

getoptsهو أمر مدمج في نظام يونكس لتحليل وسائط سطر الأوامر . وهو مصمم لمعالجة وسائط سطر الأوامر التي تتبع إرشادات بناء جملة أدوات POSIX، استنادًا إلى واجهة C الخاصة بـ getopt .

كان البرنامج السابق getoptsهو البرنامج الخارجي getoptالذي طورته مختبرات أنظمة يونكس .

تاريخ

كانت النسخة الأصلية getoptتعاني من عدة مشاكل: لم تكن قادرة على التعامل مع المسافات البيضاء أو الأحرف الخاصة بالصدفة في الوسائط، ولم تكن هناك إمكانية لتعطيل إخراج رسائل الخطأ. [ 1 ]

getoptsتم تقديم الأمر getopts لأول مرة عام 1986 في بيئة Bourne shell المرفقة مع نظام Unix SVR3. يستخدم هذا الأمر متغيرات البيئة نفسها لتتبع موضع الخيار الحالي وموضع الوسيط، وهما OPTIND و OPTARG ، ويعيد اسم الخيار في متغير خاص بالبيئة. [ 2 ] لم تكن الإصدارات السابقة من Bourne shell تحتوي على الأمر getopts .

في عام 1995، getoptsتم تضمينها في الإصدار 1 من مواصفات يونكس الموحدة / إرشادات قابلية النقل X/Open الإصدار 4. [ 3 ] ونتيجة لذلك، getoptsأصبحت متاحة الآن في صدفات الأوامر بما في ذلك صدفة بورن ، وصدفة كورن ، وصدفة ألمكويست ، وباش ، وزد إس إتش . [ 4 ]

تم أيضًا نقل أمر getopts إلى نظام التشغيل IBM i . [ 5 ]

أُعيد إحياء الاستخدام الحديث getoptجزئيًا بفضل تحسينات في تطبيق util-linux . لم يقتصر هذا الإصدار، المبني على نظام BSD getopt، على معالجة المشكلتين المتعلقتين بالإصدار القديم getopt، بل أضاف أيضًا إمكانية تحليل الخيارات الطويلة بنمط GNU والوسائط الاختيارية للخيارات، وهي ميزات كانت getoptsتفتقر إليها النسخة القديمة. [ 6 ] مع ذلك، التزمت توزيعات BSD المختلفة بالتنفيذ القديم. [ 1 ]

الاستخدام

إن ملخص استخدام getopt و getopts مشابه لنظيره في لغة C :

getopt optstring [parameters] getopts optstring varname [parameters]
  • يحتوي جزء optstring على نفس تنسيق الجزء الشقيق C.
  • يقبل قسم المعاملات ببساطة أي شيء يرغب المستخدم في أن يقوم getopt بتحليله. القيمة الشائعة هي جميع المعاملات، "$@" في نظام POSIX shell.
    • توجد هذه القيمة في دالة getopts، ولكن نادرًا ما تُستخدم، لأنها لا تستطيع سوى الوصول إلى معلمات الصدفة. مع ذلك، فهي مفيدة في إعادة ضبط المحلل اللغوي.
  • يشير الجزء varname من getopts إلى متغير shell لتخزين الخيار الذي تم تحليله.

لكن طريقة استخدام الأوامر تختلف كثيراً:

  • تقوم الدالة getopt ببساطة بإرجاع سلسلة نصية مسطحة تحتوي على رموز مفصولة بمسافات بيضاء تمثل الوسيط "المُعَيَّر". ثم يتم استخدام حلقة while لتحليلها بشكل أصلي. [ 1 ]
  • يُفترض استدعاء دالة getopts بشكل متكرر مثل دالة getopt في لغة C. وعندما تصل إلى نهاية الوسائط، تُرجع القيمة 1 (خطأ في سطر الأوامر). [ 3 ]

تحسينات

في مختلف عمليات getopts

في ربيع عام ٢٠٠٤ (خلال تطوير النسخة التجريبية من نظام سولاريس ١٠)، تم تحسين تطبيق مكتبة libc للدالة getopt() لدعم الخيارات الطويلة. ونتيجةً لذلك، أصبحت هذه الميزة الجديدة متاحةً أيضًا في الأمر المدمج في Bourne Shell. ويتم تفعيلها بواسطة اللواحق بين قوسين في سلسلة الخيارات التي تحدد الأسماء المستعارة الطويلة. [ ٧ ]getopts

يحتوي كل من KornShell و Zsh على امتداد للوسائط الطويلة. تم تعريف الأول كما هو الحال في Solaris، [ 8 ] بينما تم تنفيذ الثاني عبر zparseoptsأمر منفصل. [ 9 ]

بالإضافة إلى ذلك، يقوم KornShell بتنفيذ امتدادات optstring للخيارات التي تبدأ بـ +بدلاً من -. [ 8 ]

في لينكس، getopt

getoptsيُعد الإصدار المحسن لنظام Linux من getoptبرنامج سطر الأوامر الخارجي بديلاً عن ذلك .

يتميز الإصدار المُحسّن من Linux من getoptبمستوى أمان إضافي getoptsوميزات متقدمة. فهو يدعم أسماء الخيارات الطويلة (مثل --help)، ولا يشترط ظهور الخيارات قبل جميع المعاملات (على سبيل المثال، command operand1 operand2 -a operand3 -bيُسمح باستخدام في الإصدار المُحسّن من Linux من getoptولكنه لا يعمل مع getopts). كما يدعم أيضًا الهروب من الأحرف الخاصة في الصدفات (مثل tcsh و POSIX sh ) والوسائط الاختيارية. [ 6 ]

مقارنة

برنامج
ميزة
POSIXgetoptsSolaris/ksh getoptsأداة getopt في أنظمة Unix/BSDلينكس getopt
خيارات التقسيم لتسهيل التحليلنعمنعمنعمنعم
يسمح بإخفاء رسائل الخطأنعمنعملانعم
آمن مع المسافات البيضاء والأحرف الخاصةنعمنعملانعم
يسمح بخلط المعاملات مع الخياراتلانعملانعم
يدعم الخيارات الطويلةالمحاكاةنعملانعم
الوسائط الاختياريةمعالجة الأخطاءمعالجة الأخطاءلانعم

أمثلة

لنفترض أننا نقوم ببناء برنامج تنزيل من ويكيبيديا باستخدام لغة باش، ويأخذ ثلاثة خيارات ولا يأخذ أي وسائط إضافية:

wpdown -a اسم المقالة -l [اللغة] -v

عند الإمكان، نسمح بالحجج الطويلة التالية:

-a --article -l --language, --lang -v --verbose

للتوضيح، لم يتم تضمين أي نص مساعدة، ونفترض وجود برنامج يقوم بتنزيل أي صفحة ويب. بالإضافة إلى ذلك، جميع البرامج تأتي على الشكل التالي:

#!/bin/bash Verbose = 0 Article = lang = en # [مثال هنا]إذا كان مستوى الإسهاب ( verbose ) أكبر من 2 ، فسيتم طباعة سطر جديد يحتوي على الوسائط غير الاختيارية ، ثم طباعة سطر جديد يحتوي على الوسائط المتبقية .إذا كان مستوى الإسهاب ( verbose ) أكبر من 1 ، فسيتم طباعة الرسالة التالية : "جارٍ تنزيل %s:%s\n" " $lang " " $article " fiإذا لم تكن هناك مقالات ، فسيتم طباعة رسالة "لا توجد مقالات!" متبوعة برقم ثم يتم إنهاء البرنامج برمز خطأ 1 . save_webpage "https:// ${ lang } .wikipedia.org/wiki/ ${ article } "

باستخدام Getopt القديم

لا يدعم الأمر getopt القديم الوسائط الاختيارية:

# تحليل كل شيء؛ إذا فشل، نتوقف args = ` getopt 'a:l:v' $* ` || exit # الآن لدينا الوسائط المُعقَّمة... استبدل الوسائط الأصلية بها set -- $argsبينما صحيح ؛ نفّذ الحالة $1 في ( -v ) (( verbose++ )) ؛ إزاحة ؛؛ ( -a ) مقالة = $2 ؛ إزاحة 2 ؛؛ ( -l ) لغة = $2 ؛ إزاحة 2 ؛؛ ( -- ) إزاحة ؛ استراحة ؛؛ ( * ) خروج 1 ؛؛ # خطأ esac تمالمتبقي = ( " $@ " )

سيتوقف هذا البرنامج النصي أيضًا عن العمل مع أي عنوان مقال يحتوي على مسافة أو حرف خاص بالصدفة (مثل  ؟ أو *).

استخدام getopts

تمنح خيارات Getopts البرنامج النصي مظهر وشعور واجهة C، على الرغم من أن الوسائط الاختيارية لا تزال غائبة في POSIX:

#!/bin/sh while getopts ':a:l:v' opt ; do case $opt in ( v ) (( verbose++ )) ;; ( a ) article = $OPTARG ;; ( l ) lang = $OPTARG ;; ( : ) # "وسائط اختيارية" (معالجة الوسائط الاختيارية مفقودة) case $OPTARG in ( a ) exit 1 ;; # خطأ، وفقًا لصيغتنا ( l ) : ;; # مقبول ولكنه لا يفعل شيئًا esac ;; esac doneshift " $(( OPTIND - 1 )) " # المتبقي هو "$@"

بما أننا لم نعد نتعامل مع خيارات الصدفة مباشرةً، لم نعد بحاجة إلى إزاحتها داخل الحلقة. مع ذلك، يلزم إجراء عملية تقطيع لإزالة الخيارات المُحللة والإبقاء على الوسائط المتبقية.

من السهل نسبيًا محاكاة دعم الخيارات الطويلة للأعلام بمعاملة --fastكوسيط fastلخيار ما -. أي، -:يُضاف إلى سلسلة الخيارات، -ويُضاف كحالة لـ opt، حيث OPTARGيتم تقييم للمطابقة مع fast. دعم الخيارات الطويلة بوسيط أكثر تعقيدًا، ولكنه ممكن عند فصل الخيارات والوسائط بعلامة = . [ 10 ]

استخدام أداة getopt في نظام لينكس

يقوم برنامج getopt في لينكس بتشفير مخرجاته، ويلزم استخدام أمر "eval" لكي يقوم النظام بتفسيرها. أما باقي التعليمات البرمجية فتبقى كما هي.

#!/bin/bash# نستخدم "${@}" بدلاً من "${*}" للحفاظ على معلومات حدود الوسائط args = $( getopt --options 'a:l::v' --longoptions 'article:,lang::,language::,verbose' -- " ${ @ } " ) || exit eval "set -- ${ args } "بينما صحيح ؛ نفّذ الحالة " ${1} " في ( -v | --verbose ) ( ( verbose++ ) ) إزاحة ؛؛ ( -a | --article ) article = $ {2} إزاحة 2 ؛؛ ( -l | --lang | --language ) # التعامل مع الاختياري: getopt يُحوّله إلى سلسلة فارغة إذا [[ -n $ {2} ] ] ؛ ثم lang = $ {2} fi إزاحة 2 ؛؛ ( -- ) إزاحة فاصل ؛؛ ( * ) خروج 1 # خطأ ؛؛ esac انتهىremaining_args =( " ${ @ } " )

انظر أيضاً

مراجع

  1. 1 2 3دليل الأوامر العامة لنظام FreeBSDgetopt(1)  
  2. ماشيك، سفين. "عائلة أصداف بورن التقليدية" . تم الاسترجاع في 1 ديسمبر 2010 .
  3. 1 2 "getopts" . مجموعة Open Group (POSIX 2018) .
  4. "دليل مرجعي لباش" .
  5. آي بي إم . "برمجة Qshell لنظام IBM System i الإصدار 7.2" (ملف PDF) . آي بي إم . تم الاطلاع عليه بتاريخ 5 سبتمبر 2020 .
  6. 1 2دليل أوامر لينكس العامة من ManKier.comgetopt(1)  
  7. "getopt(3)" . مكتبة معلومات أوراكل سولاريس 11.2 .
  8. 1 2 "ksh getopts -- تحليل الخيارات من سطر أوامر البرنامج النصي" . www.mkssoftware.com .
  9. دليل أوامر لينكس العامة من ManKier.comzshmodules(1)  
  10. "محلل أوامر بسيط في Bash" .