getopt
الدالة getopt() هي دالة POSIX C تُستخدم لتحليل خيارات سطر الأوامر الخاصة بنظام Unix/POSIX على لغة C. وهي جزء من مواصفات POSIX ، وتُستخدم في جميع الأنظمة الشبيهة بنظام Unix . كما أنها اسم برنامج Unix يُستخدم لتحليل وسائط سطر الأوامر في نصوص shell البرمجية.
تاريخ
كانت إحدى المشكلات القديمة في برامج سطر الأوامر هي كيفية تحديد الخيارات؛ استخدمت البرامج المبكرة العديد من الطرق للقيام بذلك، بما في ذلك خيارات الأحرف المفردة ( ) ، وخيارات متعددة محددة -aمعًا ( ...-abc-a -b -c-inum-a arg-inum 3-a=arg-a+b/c
صُممت دالة getopt لتكون آلية قياسية تستخدمها جميع البرامج لتحليل خيارات سطر الأوامر، مما يوفر واجهة مشتركة يمكن للجميع الاعتماد عليها. ولذلك، اختار المؤلفون الأصليون من بين الصيغ المختلفة دعم خيارات الأحرف المفردة، والخيارات المتعددة المحددة معًا، والخيارات ذات الوسائط ( أو )، وكلها قابلة للتحكم بواسطة سلسلة الخيارات.-a arg-aarg
يعود تاريخ برنامج getopt إلى عام 1980 على الأقل [ 1 ] ، وقد نشرته شركة AT&T لأول مرة في مؤتمر UNIFORUM عام 1985 في دالاس، تكساس، بهدف إتاحته للجميع. [ 2 ] وقد تبنته لاحقًا توزيعات أخرى من أنظمة يونكس (مثل 4.3BSD ولينكس وغيرها ). وهو مُحدد في معيار POSIX.2 كجزء من ملف الترويسة unistd.h . وقد طُوّرت نسخ مشتقة من getopt للعديد من لغات البرمجة لتحليل خيارات سطر الأوامر.
الدالة المرافقة للدالة getopt[ 3 ] في معيار POSIX هي [ 4 ]getsubopt . تقوم هذه الدالة بتحليل سلسلة من الخيارات الفرعية المفصولة بفواصل. وقد ظهرت في نظام 4.4BSD (1995). [ 5 ]
الإضافات
تُعدّ دالة getopt دالة تعتمد على النظام، ويتوقف سلوكها على طريقة تنفيذها في مكتبة C. ومع ذلك، تتوفر بعض التطبيقات المخصصة مثل gnulib . [ 6 ]
في نظامي POSIX وBSD، تنتهي الخيارات عند مصادفة أول وسيط غير خياري، وتُرجع الدالة getopt القيمة -1 للإشارة إلى ذلك. أما في امتداد glibc ، فيُسمح باستخدام الخيارات في أي مكان لتسهيل الاستخدام؛ إذ تُبدّل الدالة getopt ضمنيًا متجه الوسائط بحيث تبقى الوسائط غير الخيارية في النهاية. وبما أن نظام POSIX يعتمد بالفعل على إرجاع القيمة -1 وتجاهلها، فيمكن دائمًا استخدامها بشكل قابل للنقل كمؤشر لنهاية الخيارات. [ 6 ]--
تتيح إضافة GNU المسماة getopt_long تحليل خيارات متعددة الأحرف أكثر وضوحًا، والتي تُعرّف بشرطتين بدلًا من واحدة. يسمح اختيار الشرطتين بالتمييز بين الخيارات متعددة الأحرف ( ) والخيارات أحادية الحرف المحددة معًا ( ). كما تتيح إضافة GNU تنسيقًا بديلًا للخيارات ذات الوسائط: . [ 6 ] لاقت هذه الواجهة رواجًا، واعتمدتها العديد من توزيعات BSD، بما في ذلك FreeBSD و Solaris (بدون التبديل) . [ 7 ] توجد طريقة بديلة لدعم الخيارات الطويلة في Solaris و Korn Shell (بتوسيع optstring )، لكنها لم تحظَ بنفس القدر من الرواج. [ 8 ]--inum-abc--name=arg
من الإضافات المتقدمة الشائعة الأخرى لـ getopt إعادة ضبط حالة تحليل الوسائط؛ وهذا مفيد كبديل لإضافة options-anyware في GNU، أو كوسيلة لـ "تقسيم" واجهة سطر الأوامر إلى طبقات بخيارات مختلفة على مستويات متعددة. يتم تحقيق ذلك في أنظمة BSD باستخدام متغير optreset ، وفي أنظمة GNU عن طريق ضبط optind على 0. [ 6 ]
الاستخدام
للمستخدمين
صيغة سطر الأوامر للبرامج القائمة على getopt هي صيغة وسيطات الأدوات المساعدة الموصى بها من قبل POSIX. باختصار: [ 9 ]
- الخيارات عبارة عن أحرف أبجدية رقمية مفردة مسبوقة
-بحرف (شرطة ناقص). - يمكن أن تأخذ الخيارات وسيطًا، إلزاميًا أو اختياريًا، أو لا تأخذ أي وسيط.
- لتحديد أن أحد الخيارات يأخذ وسيطًا، قم بتضمينه
:بعد اسم الخيار (فقط أثناء التحديد الأولي). - عندما يأخذ خيارٌ وسيطًا، يمكن أن يكون هذا الوسيط في نفس الرمز المميز أو في الرمز المميز التالي. بعبارة أخرى، إذا كان
oيأخذ وسيطًا،-ofooفإنّ هو نفسه-o foo. - يمكن ربط عدة خيارات معًا، بشرط ألا تتطلب الخيارات غير الأخيرة وسائط. إذا لم تتطلب الخيارات `
ax` و`by` أي وسائط، بينماeتتطلب `x` وسيطًا اختياريًا،-abeفإن `x` تُعتبر مكافئة لـ `y`-a -b -e، ولكنها-beaليست مكافئة لـ `y`-b -e aبسبب القاعدة السابقة. - تسبق جميع الخيارات الوسائط غير الاختيارية (باستثناء تلك الموجودة في امتداد GNU).
--يشير الرمز دائمًا إلى نهاية الخيارات.
تشمل الإضافات على الصيغة اصطلاح GNU ومواصفات CLIP الخاصة بشركة Sun. [ 10 ] [ 11 ]
للمبرمجين
يحدد دليل getopt من GNU مثل هذا الاستخدام لـ getopt() : [ 12 ]
#include <unistd.h>int getopt ( int argc , char * const argv [], const char * optstring );هنا، يُعرَّف كلٌّ من `and` argcو`and` تمامًا كما هو مُعرَّف في نموذج دالة C ؛ أي أن `and` يُشير إلى طول مصفوفة سلاسل C. يحتوي `and` على مواصفات الخيارات المطلوب البحث عنها (أحرف وأرقام عادية باستثناء `and` )، والخيارات التي تقبل وسائط (نقاط). على سبيل المثال، يُشير `and` إلى ثلاثة خيارات: `and` بدون وسيط ، و`and` بوسيط اختياري ، و`and` بوسيط إلزامي . تُطبِّق GNU هنا امتدادًا لمرادفات الخيارات الطويلة. [ 12 ]argvmainargcargvoptstringW"vf::o:"vfoW
getoptتُعيد الدالة نفسها intقيمةً إما أن تكون خيارًا charأو -1قيمةً لنهاية الخيارات. [ 12 ] ويتمثل الأسلوب المتبع في استخدام حلقة whileتكرارية (-loop) للتنقل بين الخيارات، واستخدام عبارة شرطية switch(- casestatement) لاختيار الخيارات والتعامل معها. انظر قسم الأمثلة في هذه المقالة.
لإيصال معلومات إضافية إلى البرنامج، externيشير البرنامج إلى بعض المتغيرات العامة لجلب المعلومات من getopt:
extern char * optarg ; extern int optind ; extern int opterr ; extern int optopt ;optargمؤشر إلى وسيط الخيار الحالي، إن وجد. يمكن استخدامه للتحكم في مكان بدء التحليل (مرة أخرى).optindأينgetoptينظر حاليًاargvفيopterrمفتاح منطقي يتحكم فيما إذا كان يجب على getopt طباعة رسائل الخطأ.optopt: في حالة حدوث خيار غير معروف، تكون قيمة ذلك الحرف غير المعروف.
واجهة امتداد GNU getopt_longمشابهة، على الرغم من أنها تنتمي إلى ملف رأس مختلف وتتضمن خيارًا إضافيًا لتحديد الأسماء المختصرة للخيارات الطويلة وبعض عناصر التحكم الإضافية. إذا لم يتم تحديد اسم مختصر، getoptفسيتم وضع فهرس يشير إلى بنية الخيار في longindexالمؤشر بدلاً من ذلك. [ 12 ]
#include <getopt.h>int getopt_long ( int argc , char * const argv [], const char * optstring , const struct option * longopts , int * longindex );أمثلة
باستخدام معيار POSIX، دالة getopt()
#include <stdio.h> #include <stdlib.h> #include <unistd.h>int main ( int argc , char * argv []) { int c ; int digit_optind = 0 ; int opt_a = 0 ; int opt_b = 0 ; char * opt_c = NULL ; char * opt_d = NULL ; while (( c = getopt ( argc , argv , "abc:d:012" )) != -1 ) { int this_option_optind = optind || 1 ; switch ( c ) { case '0' : case '1' : case '2' : if ( digit_optind != 0 && digit_optind != this_option_optind ) { printf ( "الأرقام تظهر في عنصرين مختلفين من argv. \n " ); } digit_optind = this_option_optind ; printf ( "الخيار %c \n " , c ); break ; case 'a' : printf ( "الخيار a \n " , opt_a = 1 ; break ; case 'b' : printf ( "الخيار b \n " , opt_b = 1 ; break ; case 'c' : printf ( "الخيار c بقيمة '%s' \n " , optarg ); opt_c = optarg ; break ; case 'd' : printf ( "الخيار d بقيمة '%s' \n " , optarg ); opt_d = optarg ; break ; case '?' :فاصل ؛ افتراضي :printf ( "?? رمز الحرف المُعاد من getopt هو 0%o ?? \n " , c ); } } if ( optind < argc ) { printf ( "عناصر ARGV غير الاختيارية: " ); while ( optind < argc ) { printf ( "%s " , argv [ optind ++ ]); } printf ( " \n " ); } return 0 ; }باستخدام امتداد GNU getopt_long
#include <stdio.h> #include <stdlib.h> #include <getopt.h>typedef struct option Option ;int main ( int argc , char * argv []) { int c ; إنت digit_optind = 0 ؛ إنت أوبت = 0 ؛ إنت بوبت = 0 ; شار * القبطية = 0 ; شار * dopt = 0 ; // تخطيط الخيارات: الاسم، الوسيط، العلامة، الاسم المختصر static Option long_options [] = { { "add" , required_argument , NULL , 0 }, { "append" , no_argument , NULL , 0 }, { "delete" , required_argument , NULL , 0 }, { "verbose" , no_argument , NULL , 0 }, { "create" , required_argument , NULL , 'c' }, { "file" , required_argument , NULL , 0 }, { NULL , 0 , NULL , 0 } }; int option_index = 0 ; بينما (( c = getopt_long ( argc , argv , "abc:d:012" , long_options , & option_index )) != -1 ) { int this_option_optind = optind ? optind : 1 ; switch ( c ) { case 0 : printf ( "الخيار %s" , long_options [ option_index ]. name ); if ( optarg ) { printf ( " مع الوسيط %s" , optarg ); } printf ( " \n" ); break ; case '0' : case '1' : case '2' : if ( digit_optind != 0 && digit_optind != this_option_optind ) { printf ( "ظهرت الأرقام في عنصرين مختلفين من عناصر argv. \n " ); } digit_optind = this_option_optind ; printf ( "الخيار %c \n " , c ); break ; case 'a' : printf ( "الخيار a \n " ); aopt = 1 ; break ; case 'b' : printf ( "الخيار b \n " ); bopt = 1 ; break ; case 'c' : printf ( "الخيار c بقيمة '%s' \n " , optarg ); copt = optarg ; break ; case 'd' : printf ( "الخيار d بقيمة '%s' \n " , optarg ); dopt = optarg ; break ; case '?' : break ; default : printf ( "?? رمز الحرف المُعاد من getopt هو 0%o ?? \n " , c ); } } if ( optind < argc ) { printf ( "عناصر ARGV غير الاختيارية: " ); while ( optind < argc ) { printf ( "%s " , argv [ optind ++ ]); } printf ( " \n " ); } return 0 ; }في الصدفة
يسعى مبرمجو سكربتات شل عادةً إلى توفير طريقة متسقة لعرض الخيارات. ولتحقيق هذا الهدف، يلجؤون إلى مكتبة getopts ويسعون إلى نقلها إلى لغتهم البرمجية.
كانت المحاولة الأولى لنقل البرنامج هي برنامج getopt ، الذي نفذه مختبر أنظمة يونكس (USL). لم يكن هذا الإصدار قادرًا على التعامل مع علامات الاقتباس والأحرف الخاصة بالصدفة، إذ لم يُظهر أي محاولات للاقتباس. وقد تم توريثه إلى نظام FreeBSD. [ 13 ]
في عام ١٩٨٦، قررت شركة USL أن التعامل غير الآمن مع الأحرف الخاصة والمسافات البيضاء لم يعد مقبولاً، فأنشأت أمر getopts المدمج في نظام Unix SVR3 Bourne Shell . تكمن ميزة دمج هذا الأمر في الصدفة في إمكانية الوصول إلى متغيراتها، مما يسمح بكتابة القيم بأمان دون الحاجة إلى علامات اقتباس. يستخدم الأمر متغيرات الصدفة لتتبع موضع الخيار الحالي وموضع الوسيط، وهما OPTIND و OPTARG ، ويعيد اسم الخيار في متغير خاص بالصدفة.
في عام 1995، getoptsتم تضمينها في الإصدار 1 من مواصفات UNIX الفردية / إرشادات قابلية النقل X/Open الإصدار 4. [ 14 ] الآن كجزء من معيار POSIX Shell، انتشرت getopts على نطاق واسع في العديد من الأغلفة الأخرى التي تحاول أن تكون متوافقة مع POSIX.
تم تجاهل getopt تقريبًا حتى أصدرت util-linux نسخة محسّنة منه، عالجت جميع مشاكل getopt القديمة عن طريق معالجة الأحرف الخاصة. كما تدعم أسماء الخيارات الطويلة في GNU. [ 15 ] من ناحية أخرى، نادرًا ما تم تطبيق الخيارات الطويلة في getoptsأوامر shell الأخرى، باستثناء ksh93 .
بلغات أخرى
getopt هو وصف موجز لبنية وسيطة أوامر POSIX الشائعة، ويتم تكراره على نطاق واسع من قبل المبرمجين الذين يسعون إلى توفير واجهة مماثلة، سواء لأنفسهم أو للمستخدم على سطر الأوامر.
- لا تُضمّن لغة C
getoptفي مكتبة C القياسية ، ويتم استدعاؤها على أنظمة POSIX. يمكن استخدام مكتبتي gnulib [ 6 ] و MinGW (كلاهما يدعم نمط GNU)، بالإضافة إلى بعض المكتبات الأصغر حجمًا، لتوفير هذه الوظائف. [ 16 ] توجد أيضًا واجهات بديلة.- تتمتع المكتبة
popt، التي يستخدمها مدير حزم RPM ، بميزة إضافية تتمثل في إمكانية إعادة الدخول إليها . - توفر عائلة
argpالوظائف في glibc و gnulib مزيدًا من الراحة والنمطية.
- تتمتع المكتبة
- يمكن للغة C++ ، إذا كانت تعمل على نظام POSIX، استدعاء
getoptنفس الشيء كما هو الحال في لغة C.boost::program_optionsتوفر مكتبة Boost وظائف مماثلة.Poco::Utilتحتوي مكتبات POCO C++ على فئاتApplicationتدعمOptionSetتحليل الوسائط.- لدى جوجل مكتبة تسمى
gflags.
- لغة C# وإطار عمل .NET : لا تحتوي مكتبتها القياسية على وظيفة getopt . تتوفر تطبيقات خارجية، مثل [ 17 ]
getopt.net. - يحتوي D
std.getoptعلى وحدة نمطية في مكتبة D القياسية. - تأتي لغة Go
flagمع الحزمة [ 18 ] التي تسمح بأسماء طويلة للعلامات. وتدعمgetoptالحزمة [ 19 ] معالجة أقرب إلى دالة C. كما توجدgetoptحزمة أخرى [ 20 ] توفر واجهة أقرب بكثير إلى واجهة POSIX الأصلية. - تأتي لغة هاسكل
System.Console.GetOptمزودة بـ ، وهي في الأساس نسخة هاسكل من مكتبة GNU getopt. [ 21 ] - لا تتضمن مكتبة جافا القياسية تطبيقًا لدالة getopt . توجد العديد من المكتبات مفتوحة المصدر، بما في ذلك
gnu.getoptالفئةGetoptالتي تم نقلها من GNU getopt، [ 22 ] و Apache Commons CLI. [ 23 ] - تتضمن لغة ليسب العديد من اللهجات المختلفة دون وجود مكتبة قياسية مشتركة. توجد بعض التطبيقات الخارجية لدالة getopt لبعض لهجات ليسب. وتحظى لغة Common Lisp بتطبيق خارجي بارز.
- لغة فري باسكال : لها تطبيقها الخاص كإحدى وحداتها القياسية المسماة
GetOpts. وهي مدعومة على جميع المنصات. - تحتوي لغة برمجة بيرل على مشتقين منفصلين من getopt في مكتبتها القياسية:
Getopt::Long[ 24 ] و [ 25 ]Getopt::Std. - لغة PHP : تحتوي على دالة getopt. [ 26 ]
- تحتوي مكتبة بايثون القياسية
getoptعلى وحدة نمطية مبنية على دالة getopt من لغة C وامتدادات GNU. [ 27 ] كما تحتوي مكتبة بايثون القياسية على وحدات نمطية أخرى لتحليل الخيارات، مما يجعلها أكثر ملاءمة للاستخدام. [ 28 ] [ 29 ] - تتضمن مكتبة روبي
getopt_longالقياسية تطبيقًا لـGetoptLonggetopt. كما تحتوي على وحدات نمطية بواجهة أكثر تطورًا وسهولة في الاستخدام. ويتوفر أيضًا تطبيق من طرف ثالث لواجهة getopt الأصلية. - لا تحتوي مكتبة Rust القياسية على دالة getopt. توفر المكتبة
clap(المسماة نسبةً إلى تحليل وسيطات سطر الأوامر) وظائف مشابهة.
مراجع
- ↑ "usr/src/lib/libc/pdp11/gen/getopt.c" . من نظام التشغيل System III ، الذي صدر في يونيو 1980، والمرتبط هنا من مشروع شجرة يونكس لوارن تومي. مؤرشف من الأصل بتاريخ 12 مايو 2023. تم الاطلاع عليه بتاريخ 22 أبريل 2024 .
{{cite web}}صيانة CS1: أخرى ( رابط ) - ↑ كوارترمان، جون (3 نوفمبر 1985). "مصدر AT&T getopt المتاح للعموم" . linux.co.cr (نُشر أصلاً في مجموعة أخبار mod.std.unix) . مؤرشف من الأصل بتاريخ 12 مايو 2023. تم الاطلاع عليه بتاريخ 22 أبريل 2024 .
- ↑ "getopt" (مواصفات المجموعة المفتوحة الأساسية، الإصدار 7، طبعة 2018؛ معيار IEEE 1003.1-2017 (مراجعة لمعيار IEEE 1003.1-2008) ). المجموعة المفتوحة . 2018. مؤرشف من الأصل بتاريخ 24-03-2024 . تم الاطلاع عليه بتاريخ 22-04-2024 .
- ↑ "getsubopt" (مواصفات المجموعة المفتوحة الأساسية، الإصدار 7، طبعة 2018؛ معيار IEEE 1003.1-2017 (مراجعة لمعيار IEEE 1003.1-2008) ). المجموعة المفتوحة . 2018. مؤرشف من الأصل بتاريخ 2023-12-02 . تم الاطلاع عليه بتاريخ 2024-04-22 .
- ↑ – دليل وظائف مكتبة FreeBSD
- 1 2 3 4 5 "getopt" . مكتبة جنو غنوليب . تم الاطلاع عليه بتاريخ 23 يناير 2020 .
- ↑ – دليل وظائف مكتبة FreeBSD
- ↑ "getopt(3)" . مكتبة معلومات أوراكل سولاريس 11.2 .
- ↑ "اتفاقيات الأدوات المساعدة" . POSIX.1-2018 .
- ↑ "بنية الوسائط" . مكتبة GNU C. تم الاطلاع عليه بتاريخ 24 يناير 2020 .
- ↑ ديفيد-جون، بوروز؛ كوالسكي الثالث، جوزيف إي. (22-01-2003). "مواصفات CLIP، الإصدار 1.0، PSARC 1999/645" (ملف PDF) . مؤرشف من الأصل (ملف PDF) بتاريخ 27-06-2020.
- 1 2 3 4 – دليل وظائف مكتبة لينكس من ManKier.com
- ↑ – دليل الأوامر العامة لنظام FreeBSD
- ↑ "getopts" . مجموعة Open Group (POSIX 2018) .
- ↑ – دليل مستخدم لينكس – أوامر المستخدم من Manned.org
- ↑ "visual studio - getopt.h: تجميع كود C الخاص بنظام Linux في نظام Windows" . Stack Overflow .
- ↑ "GNU Getopt .NET" . GitHub .
- ↑ "علامة الحزمة" .
- ↑ "Package getopt" .
- ↑ "Package getopt" .
- ↑ "System.Console.GetOpt" .
- ↑ "Class gnu.getopt.Getopt" . تم الاطلاع عليه بتاريخ 24-06-2013 .
- ↑ "Commons CLI" . Apache Commons . مؤسسة برمجيات أباتشي. 27 فبراير 2013. تم الاطلاع عليه في 24 يونيو 2013 .
- ↑ "Getopt::Long - perldoc.perl.org" .
- ↑ "Getopt::Std - perldoc.perl.org" .
- ↑ "PHP: getopt - Manual" .
- ↑ "16.5. getopt — محلل نمط C لخيارات سطر الأوامر — وثائق بايثون 3.6.0" .
- ↑ "محلل خيارات سطر الأوامر" . تم الاسترجاع في 30 أبريل 2013 .تم إيقاف استخدامه منذ الإصدار 2.7
- ↑ "محلل خيارات سطر الأوامر والوسائط والأوامر الفرعية" . تم الاطلاع عليه بتاريخ 30-04-2013 .
روابط خارجية
- مكتبة C POSIX
- برامج سطر الأوامر
