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 --version
ve--help
(hatta /bin/true
onları 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 --help
kı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 man
ve 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 -a
kı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-argument
isim olabilir; Ekstra seçenekler olmadan modal argümanlar -cf
genellikle -c -f
, vb. gibi ele alınır , bu yüzden -argument:value
teklifin garip ve bunu yapmanı tavsiye etmiyorum.
GLIBC getopt_long veya daha iyisini kullanın (örneğin argp_parse , OCaml's Arg
modülünde , ...)
Sık kullandığınız -
(bunu yapamazsanız, idare standart giriş veya çıkış için /dev/stdin
ve /dev/stdout
hatta 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 -n
kuru çalışma (à la make
), -h
yardım, -v
ayrı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.txt
okunan 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 ( bash
ya da gibi zsh
)
Bazı eski Unix komutları (örneğin dd
veya 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 help
git --help
git
subcommand
git
subcommand
--help
Nadir durumlarda da kullanabilir argv[0]
(programa üzerine sembolik kullanarak), örneğin bash
olarak çağrılan rbash
farklı 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.dlopen
dlsym
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 /option
bir 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 crontab
işte) yürütmek isteyebilir .
ls -ltr
seçeneğin birleştirilmesidir-l
,-t
ve-r
. GNU tarzı programlar da tipik olarak,--reverse
yerine bir çift tire ile kelime tabanlı seçeneklere izin verir-r
.-h
Yardı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 .