POSIX sistemlerinde (örneğin Linux, MacOSX), en azından bir kabuk terminalinde başlatılan programlar için (örneğin çoğu), GNU kodlama kurallarını (ortak argüman adlarını da listeleyen) kullanmanızı ve POSIX yardımcı programları kurallarına bakmanızı öneririm. , özel yazılım için bile:
her zaman idare --versionve--help (hatta /bin/trueonları kabul eder !!). Ben yazılımın yazarları anlamak değil küfür --help(çünkü onlardan nefret, prog --help bir ilk komut yeni bir program üzerinde çalışıyorum)! Genellikle --helpkısaltılabilir-h
Var --help(en yaygın olanları ve bu durumda listede ... onlardan daha çok yoksa bütün seçenekler ileti listesini açıkça bazı atıfta manve seçeneklerin varsayılan değerler sayfası veya bazı URL) ve belki önemli (ve programa özgü ) Ortam Değişkenleri. Bu seçenek listelerini seçenek argümanı hatası üzerinde göster.
kabul -akısa argüman (tek harf) ve bazı eşdeğer --long-argument, bu yüzden -a2 --long-argument=2, --long-argument 2; Tabii ki (nadiren kullanılan seçenekler için) bir --only-long-argumentisim olabilir; Ekstra seçenekler olmadan modal argümanlar -cfgenellikle -c -f, vb. gibi ele alınır , bu yüzden -argument:valueteklifin garip ve bunu yapmanı tavsiye etmiyorum.
GLIBC getopt_long veya daha iyisini kullanın (örneğin argp_parse , OCaml's Argmodülünde , ...)
Sık kullandığınız -(bunu yapamazsanız, idare standart giriş veya çıkış için /dev/stdinve /dev/stdouthatta birkaç işletim sistemlerinde onları olmamasından)
seçenek programlarının çoğunu yeniden kullanarak benzer programların davranışlarını taklit etmek ; özellikle -nkuru çalışma (à la make), -hyardım, -vayrıntılandırma vb. için ...
--seçenekler ve dosyalar veya diğer argümanlar arasında ayırıcı olarak kullanın
Eğer programınız stdin'denisatty daha sınamak için kullanıyorsa (ve bu durumda "etkileşimli" davranıyorsanız), etkileşimli olmayan modu zorlamak için bir seçenek sunun, eğer programınız bir GUI arayüzüne sahipse (ve X11 masaüstünde test eder ) toplu iş veya komut satırında kullanılmalıdır.getenv("DISPLAY")
Bazı programlar (örn gcc), böylece dolaylı argüman listelerini kabul @somefile.txtokunan programın argümanları anlam edilir somefile.txt; Programınız çok fazla sayıda argümanı kabul ederse bu yararlı olabilir (çekirdeğinizden fazla ARG_MAX)
BTW, programınız ve normal mermileriniz için otomatik tamamlama olanakları bile ekleyebilirsiniz ( bashya da gibi zsh)
Bazı eski Unix komutları (örneğin ddveya hatta sed) tarihsel uyumluluk için garip komut argümanlarına sahiptir. Kötü alışkanlıklarına uymamanı tavsiye ederim (daha iyi bir değişken yapmıyorsanız).
Yazılımınız bir dizi ilgili komut satırı programındaysa, kabul eden ve çok sayıda özelliği olan ve kesinlikle bir geliştirme aracı olarak kullandığınız git'ten ilham alın.git helpgit --helpgitsubcommandgitsubcommand--help
Nadir durumlarda da kullanabilir argv[0](programa üzerine sembolik kullanarak), örneğin basholarak çağrılan rbashfarklı bir davranış (vardır kısıtlı kabuk). Ama genelde bunu yapmayı önermiyorum; Programınızın shebang'ı kullanarak, yani execve (2)#! tarafından ilk satırda yorumlanan bir komut dosyası tercümanı olarak kullanılıp kullanılamayacağı mantıklı olabilir . Böyle hileler yaparsanız, iletiler dahil olmak üzere bunları belgelendiğinizden emin olun .--help
POSIX unutmayın kabuk edilir globbing (argümanlar önce ! Programınızı çalıştıran), yani (gibi karakterler gerektiren önlemek *veya $veya ~kabuk kaçan olması gerekir seçeneklerinde).
Bazı durumlarda, yazılımınıza GNU guile veya Lua gibi bir tercüman ekleyebilir ( programlama dillerinde uzman değilseniz kendi Turing-komple kodlama dilinizi icat etmekten kaçının ). Bunun, yazılımınızın tasarımı üzerinde derin sonuçları vardır (bu nedenle erken düşünülmelidir!). Daha sonra bu tercümana bir komut dosyasını veya bir ifadeyi kolayca iletebilmelisiniz. Bu ilginç yaklaşımı benimserseniz, yazılımınızı ve yorumlanmış ilkellerini dikkatlice tasarlayın; işiniz için büyük betikleri kodlayan garip bir kullanıcı olabilir.
Diğer durumlarda, ileri düzeydeki kullanıcıların eklentilerini yazılımınıza yüklemelerine izin vermek isteyebilirsiniz ( à la & dinamik yükleme tekniklerini kullanarak ). Yine, bu çok önemli bir tasarım kararıdır (eklenti arayüzünü dikkatli bir şekilde tanımlayın ve belgeleyin) ve program seçeneklerini bu eklentilere geçirmek için bir kural tanımlamanız gerekir.dlopendlsym
Yazılımınız karmaşık bir şeyse, bazı yapılandırma dosyalarını (program argümanlarının eklenmesine veya değiştirilmesine ek olarak) kabul etmesini sağlayın ve muhtemelen tüm kodları çalıştırmadan bu yapılandırma dosyalarını test etmek (veya yalnızca ayrıştırmak) için bir yol vardır. Örneğin, bir posta aktarım aracısı (Exim veya Postfix gibi) oldukça karmaşıktır ve "yarı kuru" olarak çalışabilmesi yararlıdır (örneğin, belirli bir e-posta adresini gerçekten bir e-posta göndermeden nasıl işlediğini gözlemleyerek).
Bunun /optionbir Windows veya VMS olayı olduğuna dikkat edin . POSIX sistemlerinde delilik olurdu (çünkü dosya hiyerarşisi /bir dizin ayırıcı olarak kullanır ve kabuk globbing yapar). Tüm cevabım çoğunlukla Linux (ve POSIX) içindir.
Not Mümkünse, programınızı ücretsiz bir yazılım haline getirin , bazı kullanıcılardan ve geliştiricilerden iyileştirmeler elde edersiniz (ve yeni bir program seçeneği eklemek genellikle mevcut bir özgür yazılıma eklenmesi en kolay şeylerden biridir). Ayrıca, sorunuzun amacı hedef kitleye çok bağlıdır : büyükler için bir oyun veya büyükanne için bir tarayıcı muhtemelen bir derleyici ile aynı tür ve miktarda seçeneklere veya veri merkezi sysadmins için bir ağ denetçisine veya mikroişlemci için bir CAD yazılımına ihtiyaç duymaz. mimarlar veya köprü tasarımcıları için. Programlama ve senaryoya aşina bir mühendis, büyükannenizden çok daha fazla ayarlanabilir seçeneğe sahip olmaktan çok hoşlanıyor ve muhtemelen başvurunuzu X11 olmadan (belki de bir crontabişte) yürütmek isteyebilir .
ls -ltrseçeneğin birleştirilmesidir-l,-tve-r. GNU tarzı programlar da tipik olarak,--reverseyerine bir çift tire ile kelime tabanlı seçeneklere izin verir-r.-hYardım etmek,--seçeneklerin sonunu işaret etmek,-stdin'den okumaya izin vermek için bir dosya adı olarak belirtmek vb. Gibi diğer popüler sözleşmeler var .