Pada sistem POSIX (mis. Linux, MacOSX), setidaknya untuk program yang mungkin dimulai pada terminal shell (mis. Sebagian besar dari mereka), saya akan merekomendasikan menggunakan konvensi pengkodean GNU (yang juga mencantumkan nama argumen umum) dan melihat ke dalam pedoman utilitas POSIX , bahkan untuk perangkat lunak berpemilik:
selalu menangani --version
dan--help
(bahkan /bin/true
menerimanya !!). Saya mengutuk penulis perangkat lunak tidak mengerti --help
, saya benci mereka (karena prog --help
adalah perintah pertama yang saya coba pada program baru)! Seringkali --help
dapat disingkat-h
Minta --help
pesan mencantumkan semua opsi (kecuali Anda memiliki terlalu banyak di antaranya ... dalam hal ini cantumkan yang paling umum dan secara eksplisit merujuk ke beberapa man
halaman atau beberapa URL) dan nilai default opsi, dan mungkin penting (dan spesifik program) ) variabel lingkungan. Tampilkan daftar opsi ini pada kesalahan argumen opsi.
menerima -a
argumen singkat (huruf) dan memiliki beberapa setara --long-argument
, jadi -a2
--long-argument=2
, --long-argument 2
; tentu saja Anda dapat memiliki (untuk opsi yang jarang digunakan) beberapa --only-long-argument
nama; untuk argumen modal tanpa opsi tambahan -cf
umumnya ditangani sebagai -c -f
, dll. jadi -argument:value
proposal Anda aneh, dan saya tidak menyarankan melakukan itu.
gunakan GLIBC getopt_long atau lebih baik (mis. argp_parse , di OCaml Arg
modulnya , ...)
sering digunakan -
untuk input atau output standar (jika Anda tidak dapat melakukannya, pegang /dev/stdin
& /dev/stdout
bahkan pada beberapa sistem operasi yang tidak memilikinya)
meniru perilaku program serupa dengan menggunakan kembali sebagian besar konvensi opsi mereka; khususnya -n
untuk dry run (à la make
), -h
untuk bantuan, -v
untuk kata kerja, dll ...
gunakan --
sebagai pemisah antara opsi & file atau argumen lainnya
jika program Anda menggunakan isatty
untuk menguji daripada stdin adalah terminal (dan berperilaku "interaktif" dalam kasus itu), berikan opsi untuk memaksakan mode non-interaktif, juga jika program Anda memiliki antarmuka GUI (dan tes getenv("DISPLAY")
pada desktop X11) tetapi juga bisa digunakan dalam batch atau command line.
Beberapa program (misalnya gcc
) menerima daftar argumen tidak langsung, demikian @somefile.txt
juga artinya membaca argumen program dari somefile.txt
; ini bisa berguna ketika program Anda mungkin menerima banyak argumen (lebih banyak dari kernel Anda ARG_MAX
)
BTW, Anda bahkan dapat menambahkan beberapa fasilitas lengkapi-otomatis untuk program Anda dan shell yang biasa (seperti bash
atau zsh
)
Beberapa perintah Unix lama (misalnya dd
, atau bahkan sed
) memiliki argumen perintah aneh untuk kompatibilitas historis. Saya akan merekomendasikan untuk tidak mengikuti kebiasaan buruk mereka (kecuali jika Anda membuat varian yang lebih baik dari mereka).
Jika perangkat lunak Anda adalah serangkaian program baris perintah terkait, mengambil inspirasi dari git (yang pasti Anda gunakan sebagai alat pembangunan), yang menerima git help
dan git --help
dan memiliki banyak git
subcommand
dangit
subcommand
--help
Dalam kasus yang jarang terjadi, Anda mungkin juga menggunakan argv[0]
(dengan menggunakan symlink pada program Anda), misalnya bash
dipanggil karena rbash
memiliki perilaku yang berbeda ( shell terbatas ). Tetapi saya biasanya tidak merekomendasikan melakukan itu; mungkin masuk akal jika program Anda dapat digunakan sebagai penerjemah skrip menggunakan shebang yaitu #!
pada baris pertama yang ditafsirkan oleh exec (2) . Jika Anda melakukan trik semacam itu, pastikan untuk mendokumentasikannya, termasuk dalam --help
pesan.
Ingat bahwa pada POSIX shell adalah globbing argumen ( sebelum menjalankan program Anda!), Jadi hindari meminta karakter (seperti *
atau $
atau ~
) dalam opsi yang perlu shell-melarikan diri.
Dalam beberapa kasus, Anda dapat menyematkan juru bahasa seperti GNU Chile atau Lua di perangkat lunak Anda (hindari menciptakan bahasa skrip lengkap Turing sendiri jika Anda tidak ahli dalam bahasa pemrograman). Ini memiliki konsekuensi mendalam pada desain perangkat lunak Anda (jadi harus dipikirkan sejak dini!). Anda kemudian dapat dengan mudah memberikan beberapa skrip atau ekspresi kepada penerjemah itu. Jika Anda mengambil pendekatan yang menarik, rancang perangkat lunak Anda dan primitifnya yang ditafsirkan dengan hati-hati; Anda bisa memiliki beberapa pengguna aneh yang mengkodekan skrip besar untuk hal Anda.
Dalam kasus lain, Anda mungkin ingin membiarkan pengguna tingkat lanjut memuat plugin mereka ke perangkat lunak Anda (menggunakan teknik pemuatan dinamis à la dlopen
& dlsym
). Sekali lagi, ini adalah keputusan desain yang sangat penting (jadi tentukan dan dokumentasikan antarmuka plugin dengan hati-hati), dan Anda harus menentukan konvensi untuk meneruskan opsi program ke plugin ini.
Jika perangkat lunak Anda adalah hal yang rumit, buat ia menerima beberapa file konfigurasi (sebagai tambahan atau penggantian argumen program) dan mungkin memiliki beberapa cara untuk menguji (atau hanya menguraikan) file-file konfigurasi ini tanpa menjalankan semua kode. Sebagai contoh, agen transfer surat (seperti Exim atau Postfix) cukup kompleks, dan berguna untuk dapat "setengah kering" menjalankannya (misalnya mengamati bagaimana ia menangani beberapa alamat email yang diberikan tanpa benar-benar mengirim email).
Perhatikan bahwa /option
ini adalah hal Windows atau VMS. Ini akan menjadi gila pada sistem POSIX (karena hirarki file digunakan /
sebagai pemisah direktori, dan karena shell melakukan globbing). Semua jawaban saya sebagian besar untuk Linux (dan POSIX).
PS Jika memungkinkan, jadikan program Anda perangkat lunak gratis , Anda akan mendapatkan peningkatan dari beberapa pengguna & pengembang (dan menambahkan opsi program baru sering kali merupakan salah satu hal termudah untuk ditambahkan ke perangkat lunak gratis yang ada). Juga, pertanyaan Anda tergantung banyak pada penonton dimaksudkan : permainan untuk remaja atau browser untuk nenek mungkin tidak perlu jenis yang sama dan jumlah pilihan dari compiler, atau seorang inspektur jaringan untuk sysadmin datacenter, atau perangkat lunak CAD untuk mikroprosesor arsitek atau desainer jembatan. Seorang insinyur yang akrab dengan pemrograman & skrip mungkin lebih suka memiliki banyak opsi merdu dari nenek Anda, dan mungkin ingin menjalankan aplikasi Anda tanpa X11 (mungkin dalam crontab
pekerjaan).
ls -ltr
untuk menggabungkan opsi-l
,-t
dan-r
. Program gaya GNU juga biasanya memungkinkan opsi berbasis kata dengan tanda hubung ganda--reverse
sebagai ganti-r
. Ada konvensi populer lainnya seperti-h
menunjukkan bantuan,--
memberi tanda pada akhir opsi, menetapkan-
sebagai nama file untuk memungkinkan membaca dari stdin, dll.