Getopt - Getopt

getopt bir C kütüphane işlevi ayrıştırmak için kullanılır komut satırı seçenekleri Unix / POSIX tarzı. Bu bir parçası POSIX şartname ve evrenseldir Unix benzeri sistemleri.

Aynı zamanda, kabuk betiklerinde komut satırı argümanlarını ayrıştırmak için bir Unix programının adıdır.

Tarih

İle uzun süredir devam eden bir sorun komut satırı programları seçeneklerin nasıl belirleneceği; İlk programlar, tek karakter seçenekleri de dahil olmak üzere bunu yapmanın birçok yolunu kullandı (-a), birden çok seçenek birlikte belirtildi (-ABC eşdeğerdir -a -b -c), çok karakterli seçenekler (altın), bağımsız değişkenli seçenekler (-a arg, - altın 3, -a = arg) ve farklı önek karakterleri (-a, + b, / c).

getopt işlevi tüm programların ayrıştırmak için kullanabileceği standart bir mekanizma olarak yazılmıştır komut satırı seçenekleri Böylece herkesin güvenebileceği ortak bir arayüz olacaktı. Bu nedenle, orijinal yazarlar tek karakter seçenekleri, birlikte belirtilen birden çok seçenek ve bağımsız değişkenli seçenekleri (-a arg veya -aarg), tümü bir seçenek dizesi ile kontrol edilebilir.

getopt en az 1980 yılına kadar uzanıyor[1] ve ilk olarak tarafından yayınlandı AT&T 1985 yılında Dallas, Texas'ta düzenlenen UNIFORUM konferansında, kamu malı olarak sunulması amacıyla.[kaynak belirtilmeli ] Bunun sürümleri daha sonra Unix'in diğer tatları tarafından toplandı (4.3BSD, Linux, vb.). Belirtilmiştir POSIX.2 standart olarak unistd.h başlık dosyası. Türevleri getopt birçokları için yaratıldı Programlama dilleri komut satırı seçeneklerini ayrıştırmak için.

Uzantılar

getopt sisteme bağlı bir işlevdir ve davranışı C kütüphanesindeki uygulamaya bağlıdır. Gibi bazı özel uygulamalar gnulib ancak mevcuttur.[2]

Geleneksel (POSIX ve BSD) işleme, seçeneklerin ilk seçenek olmayan bağımsız değişkenle karşılaşıldığında sona ermesidir ve getopt bunu belirtmek için -1 döndürür. İçinde glibc uzantı, ancak seçeneklere izin verilir herhangi bir yer kullanım kolaylığı için; getopt bağımsız değişken vektörüne dolaylı olarak izin verir, böylece sonunda seçenek olmayanları bırakmaya devam eder. POSIX zaten -1 döndürme kuralına sahip olduğundan -- ve atlandığında, her zaman taşınabilir bir şekilde seçeneklerin sonu göstergesi olarak kullanılabilir.[2]

Bir GNU uzantı, getopt_long, bir yerine iki tire ile sunulan daha okunabilir, çok karakterli seçeneklerin ayrıştırılmasına izin verir. İki çizgi seçimi, çoklu karakter seçeneklerine (--inum) birlikte belirtilen tek karakter seçeneklerinden ayırt edilmek için (-ABC). GNU uzantısı, bağımsız değişkenli seçenekler için alternatif bir biçime de izin verir: --name = arg.[2] Bu arayüz popüler olduğunu kanıtladı ve aşağıdakiler de dahil olmak üzere birçok BSD dağıtımı tarafından benimsendi (izin verilmeden) FreeBSD yanı sıra Solaris.[3] Uzun seçenekleri desteklemenin alternatif bir yolu Solaris ve Korn Shell'de görülmektedir ( Optstring), ancak o kadar popüler değildi.[4]

Getopt'un diğer bir yaygın gelişmiş uzantısı, bağımsız değişken çözümlemesinin durumunu sıfırlamaktır; bu, options-anyware GNU uzantısının bir ikamesi olarak veya farklı düzeylerde farklı seçeneklerle bir komut satırı arabirimi kümesini "katmanlaştırmanın" bir yolu olarak yararlıdır. Bu, BSD sistemlerinde bir optreset değişken ve GNU sistemlerinde ayarlayarak tercih etmek 0'a kadar.[2]

Ortak bir tamamlayıcı işlevi getopt dır-dir getsubopt. Virgülle ayrılmış alt seçenekler dizisini ayrıştırır.[5]

Kullanım

Kullanıcılar için

Getopt tabanlı programlar için komut satırı sözdizimleri, POSIX tarafından önerilen Yardımcı Program Argüman Sözdizimi'dir. Kısacası:[6]

  • Seçenekler tek karakterli alfasayısaldır ve önünde bir - (tire-eksi) karakter.
  • Seçenekler, zorunlu veya isteğe bağlı bir argüman alabilir veya hiçbirini alabilir.
  • Bir seçenek bir argüman aldığında, bu aynı jetonda veya bir sonrakinde olabilir. Başka bir deyişle, eğer Ö bir argüman alır, -ofoo aynıdır -o foo.
  • Son olmayanlar argüman almadığı sürece birden fazla seçenek birbirine zincirlenebilir. Eğer a ve b tartışmak yok e isteğe bağlı bir argüman alır, -abe aynıdır -a -b -e, fakat -olmak ile aynı değil -olmak önceki kural nedeniyle.
  • Tüm seçenekler, seçenek olmayan argümanlardan önce gelir (GNU uzantısı dışında). -- her zaman seçeneklerin sonunu işaretler.

Sözdizimindeki uzantılar arasında GNU konvansiyonu ve Sun'ın KLİPS Şartname.[7][8]

Programcılar için

GNU'nun getopt kılavuzu, getopt için böyle bir kullanım belirtir:[9]

#Dahil etmek <unistd.h>int getopt(int argc, kömür * sabit argv[],           sabit kömür *Optstring);

İşte argc ve argv tam olarak C'deki gibi tanımlanır ana işlev prototipi, yani argc, dizge dizilerinin argv dizisinin uzunluğunu belirtir. Optstring aranacak seçeneklerin bir belirtimini içerir (normal alfanümerikler hariç W) ve bağımsız değişkenlerin (iki nokta üst üste) kabul edileceği seçenekler. Örneğin, "vf :: o:" üç seçeneği ifade eder: tartışmasız v, isteğe bağlı bir argüman fve zorunlu bir argüman Ö. GNU burada bir W uzun seçenek eş anlamlıları için uzantı.[9]

getopt kendisi bir seçenek karakteri olan veya seçeneklerin sonu için -1 olan bir tamsayı döndürür.[9] Deyim, seçenekler arasında gezinmek için bir while döngüsü kullanmak ve seçenekleri seçmek ve bunlara göre hareket etmek için bir anahtar-durum ifadesi kullanmaktır. Bu makalenin örnek bölümüne bakın.

Ekstra bilgileri programa geri iletmek için, birkaç küresel dış değişkenlerden bilgi almak için program tarafından referans alınır. getopt:

dış kömür *optarg;dış int tercih etmek, opterr, optopt;
optarg
Varsa, geçerli seçeneğin argümanına bir işaretçi. Ayrıştırmaya nereden başlayacağınızı kontrol etmek için kullanılabilir (tekrar).
tercih etmek
Getopt'un şu anda baktığı yer argv.
opterr
Getopt öğesinin hata mesajlarını yazdırıp yazdırmayacağını kontrol eden bir boole anahtarı.
optopt
Tanınmayan bir seçenek oluşursa, bu tanınmayan karakterin değeri.

GNU uzantısı getopt_long arayüz benzerdir, ancak farklı bir başlık dosyası ve uzun seçeneklerin "kısa" adlarını ve bazı ekstra kontrolleri tanımlamak için fazladan bir seçenek alır. Kısa bir isim tanımlanmamışsa, getopt, seçenek yapısına atıfta bulunan bir indeks koyacaktır. uzun dizin bunun yerine işaretçi.[9]

#Dahil etmek <getopt.h>int getopt_long(int argc, kömür * sabit argv[],           sabit kömür *Optstring,           sabit yapı seçenek *Longopts, int *uzun dizin);

Örnekler

POSIX standardını kullanma getopt

#Dahil etmek  / * for printf * /#Dahil etmek  / * çıkış için * /#Dahil etmek  / * getopt için * /int ana (int argc, kömür **argv) {    int c;    int digit_optind = 0;    int aopt = 0, bopt = 0;    kömür *Kıpti = 0, *dopt = 0;    süre ((c = getopt(argc, argv, "abc: d: 012")) != -1) {        int this_option_optind = tercih etmek ? tercih etmek : 1;        değiştirmek (c) {        durum '0':        durum '1':        durum '2':            Eğer (digit_optind != 0 && digit_optind != this_option_optind)                printf ("rakamlar iki farklı argv öğesinde bulunur. n");            digit_optind = this_option_optind;            printf ("seçenek% c n", c);            kırmak;        durum 'a':            printf ("seçenek a n");            aopt = 1;            kırmak;        durum 'b':            printf ("seçenek b n");            bopt = 1;            kırmak;        durum 'c':            printf ("'% s' değerine sahip c seçeneği n", optarg);            Kıpti = optarg;            kırmak;        durum 'd':            printf ("'% s' değerine sahip d seçeneği n", optarg);            dopt = optarg;            kırmak;        durum '?':            kırmak;        varsayılan:            printf ("?? getopt 0% o karakter kodunu döndürdü ?? n", c);        }    }    Eğer (tercih etmek < argc) {        printf ("isteğe bağlı olmayan ARGV öğeleri:");        süre (tercih etmek < argc)            printf ("% s", argv[tercih etmek++]);        printf (" n");    }    çıkış (0);}

GNU uzantısını kullanma getopt_long

#Dahil etmek  / * for printf * /#Dahil etmek  / * çıkış için * /#Dahil etmek getopt_long için  / *; POSIX standart getopt unistd.h dosyasında * /int ana (int argc, kömür **argv) {    int c;    int digit_optind = 0;    int aopt = 0, bopt = 0;    kömür *Kıpti = 0, *dopt = 0;    statik yapı seçenek long_options[] = {    / * AD ARGUMENT BAYRAĞININ KISA ADI * /        {"Ekle",     required_argument, BOŞ, 0},        {"ekle",  tartışmasızdır,       BOŞ, 0},        {"sil",  required_argument, BOŞ, 0},        {"ayrıntılı", tartışmasızdır,       BOŞ, 0},        {"oluşturmak",  required_argument, BOŞ, 'c'},        {"dosya",    required_argument, BOŞ, 0},        {BOŞ,      0,                 BOŞ, 0}    };    int option_index = 0;    süre ((c = getopt_long(argc, argv, "abc: d: 012",                 long_options, &option_index)) != -1) {        int this_option_optind = tercih etmek ? tercih etmek : 1;        değiştirmek (c) {        durum 0:            printf ("seçenek% s", long_options[option_index].isim);            Eğer (optarg)                printf ("arg% s ile", optarg);            printf (" n");            kırmak;        durum '0':        durum '1':        durum '2':            Eğer (digit_optind != 0 && digit_optind != this_option_optind)              printf ("rakamlar iki farklı argv öğesinde bulunur. n");            digit_optind = this_option_optind;            printf ("seçenek% c n", c);            kırmak;        durum 'a':            printf ("seçenek a n");            aopt = 1;            kırmak;        durum 'b':            printf ("seçenek b n");            bopt = 1;            kırmak;        durum 'c':            printf ("'% s' değerine sahip c seçeneği n", optarg);            Kıpti = optarg;            kırmak;        durum 'd':            printf ("'% s' değerine sahip d seçeneği n", optarg);            dopt = optarg;            kırmak;        durum '?':            kırmak;        varsayılan:            printf ("?? getopt 0% o karakter kodunu döndürdü ?? n", c);        }    }    Eğer (tercih etmek < argc) {        printf ("isteğe bağlı olmayan ARGV öğeleri:");        süre (tercih etmek < argc)            printf ("% s", argv[tercih etmek++]);        printf (" n");    }    çıkış (0);}

Kabukta

Kabuk komut dosyası programcıları, genellikle seçenek sağlamak için tutarlı bir yol sağlamak isterler. Bu hedefe ulaşmak için, jetoptlara dönüyorlar ve bunu kendi dillerine aktarmaya çalışıyorlar.

İlk taşıma denemesi programdı getopt, tarafından uygulandı Unix Sistem Laboratuvarları (USL). Bu sürüm, alıntı yapma girişimi göstermediğinden, alıntı yapma ve kabuk meta karakterleriyle başa çıkamadı. FreeBSD'ye miras kalmıştır.[10]

1986'da USL, meta karakterler ve boşluklar etrafında güvensiz olmanın artık kabul edilemez olduğuna karar verdi ve yerleşik Getopts bunun yerine Unix SVR3 Bourne Shell için komut. Komutu kabuğa oluşturmanın avantajı, artık kabuğun değişkenlerine erişiminin olmasıdır, böylece değerler alıntı yapılmadan güvenli bir şekilde yazılabilir. Mevcut ve argüman konumlarının konumunu izlemek için kabuğun kendi değişkenlerini kullanır, OPTIND ve OPTARGve seçenek adını bir kabuk değişkeninde döndürür.

1995'te, Getopts dahil edildi Tek UNIX Belirtimi versiyon 1 / X / Açık Taşınabilirlik Yönergeleri Sayı 4.[11] Artık POSIX Kabuk standardının bir parçası olan getoptlar, POSIX uyumlu olmaya çalışan diğer birçok kabukta çok uzaklara yayılmıştır.

getopt temelde unutulmuştu util-linux tüm eski getopt sorunlarını kaçarak düzelten gelişmiş bir sürümle çıktı. Ayrıca GNU'nun uzun seçenek adlarını da destekler.[12] Öte yandan, uzun seçenekler nadiren uygulanmaktadır. Getopts diğer mermilerde komuta, ksh93 bir istisna olmak.

Diğer dillerde

getopt ortak POSIX komut argüman yapısının kısa bir açıklamasıdır ve hem kendilerine hem de komut satırındaki kullanıcıya benzer bir arayüz sağlamak isteyen programcılar tarafından geniş çapta çoğaltılır.

  • C: POSIX olmayan sistemler gönderilmez getopt C kütüphanesinde, ancak gnulib[2] ve MinGW (her ikisi de GNU stilini kabul eder) ve bazı daha minimal kitaplıklar işlevselliği sağlamak için kullanılabilir.[13] Alternatif arayüzler de mevcuttur:
    • popt kütüphane, tarafından kullanılan RPM paket yöneticisi, olmanın ek avantajına sahiptir giriş.
    • argp glibc ve gnulib'deki işlevler ailesi biraz daha fazla kolaylık ve modülerlik sağlar.
  • D: D programlama dili standart kitaplıkta bir getopt modülüne sahiptir.
  • Git: ile birlikte gelir bayrak paket[14] bu uzun bayrak isimlerine izin verir. getopt paket [15] C işlevine daha yakın işlemeyi destekler. Başka biri de var getopt paket [16] orijinal POSIX'e çok daha yakın bir arayüz sağlar.
  • Haskell: GNU getopt kitaplığının bir Haskell portu olan System.Console.GetOpt ile birlikte gelir.[17]
  • Java: Java standart kitaplığında getopt uygulaması yoktur. GNU getopt'tan taşınan gnu.getopt.Getopt dahil olmak üzere birçok açık kaynak modülü mevcuttur.[18] ve Apache Commons CLI.[19]
  • Lisp: ortak bir standart kitaplığı olmayan birçok farklı lehçeye sahiptir. Lisp'in bazı lehçeleri için bazı üçüncü parti getopt uygulamaları vardır. Ortak Lisp önemli bir üçüncü taraf uygulamasına sahiptir.
  • Ücretsiz Pascal: GetOpts adlı standart birimlerinden biri olarak kendi uygulamasına sahiptir. Tüm platformlarda desteklenmektedir.
  • Perl programlama dili: standart kitaplığında getopt'un iki ayrı türevi vardır: Getopt :: Long[20] ve Getopt :: Std.[21]
  • PHP: getopt () işlevine sahiptir.[22]
  • Python: içinde bir modül içerir standart kitaplık C'nin getopt ve GNU uzantılarına dayalı.[23] Python'un standart kitaplığı, kullanımı daha uygun seçenekleri ayrıştırmak için başka modüller de içerir.[24][25]
  • Ruby: Standart kitaplığı GetoptLong'da getopt_long uygulamasına sahiptir. Ruby ayrıca standart kitaplığında daha sofistike ve kullanışlı bir arayüze sahip modüllere sahiptir. Orijinal getopt arayüzünün üçüncü taraf uygulaması mevcuttur.
  • .NET Framework: standart kitaplığında getopt işlevine sahip değildir. Üçüncü taraf uygulamaları mevcuttur.[26]

Referanslar

  1. ^ ftp://pdp11.org.ru/pub/unix-archive/PDP-11/Distributions/usdl/SysIII/[kalıcı ölü bağlantı ]
  2. ^ a b c d e "getopt". GNU Gnulib. Alındı 23 Ocak 2020.
  3. ^ getopt_long (3) – FreeBSD Kitaplık İşlevleri Manuel
  4. ^ "getopt (3)". Oracle Solaris 11.2 Bilgi Kitaplığı.
  5. ^ getsubopt (3) – FreeBSD Kitaplık İşlevleri Manuel
  6. ^ "Yardımcı Program Kuralları". POSIX.1-2018.
  7. ^ "Bağımsız Değişken Sözdizimi". GNU C Kütüphanesi. Alındı 24 Ocak 2020.
  8. ^ David-John, Burrowes; Kowalski III, Joseph E. (22 Ocak 2003). "CLIP Spesifikasyonu, Sürüm 1.0, PSARC 1999/645" (PDF).
  9. ^ a b c d getopt (3) – Linux Kitaplık İşlevleri Manuel
  10. ^ getopt (1) – FreeBSD Genel Komutlar Manuel
  11. ^ "getopts". Açık Grup (POSIX 2018).
  12. ^ getopt (1) – Linux Kullanıcılar Manuel - Kullanıcı Komutları
  13. ^ "visual studio - getopt.h: Windows'ta Linux C-Kodunu Derleme". Yığın Taşması.
  14. ^ "Paket bayrağı".
  15. ^ "Paket getopt".
  16. ^ "Paket getopt".
  17. ^ "System.Console.GetOpt".
  18. ^ "Sınıf gnu.getopt.Getopt". Alındı 2013-06-24.
  19. ^ "Commons CLI". Apache Commons. Apache Yazılım Vakfı. 27 Şubat 2013. Alındı 24 Haziran 2013.
  20. ^ "Getopt :: Long - perldoc.perl.org".
  21. ^ "Getopt :: Std - perldoc.perl.org".
  22. ^ "PHP: getopt - Manuel".
  23. ^ "16.5. Getopt - komut satırı seçenekleri için C tarzı ayrıştırıcı - Python 3.6.0 belgeleri".
  24. ^ "Komut satırı seçenekleri için ayrıştırıcı". Alındı 2013-04-30. 2.7 sürümünden beri kullanımdan kaldırıldı
  25. ^ "Komut satırı seçenekleri, argümanlar ve alt komutlar için ayrıştırıcı". Alındı 2013-04-30.
  26. ^ "GNU Getopt .NET".

Dış bağlantılar