Di suatu tempat saya melihat kata-kata kasar terhadap java / javac diduga menggunakan campuran Windows dan gaya Unix seperti
java -classpath ... -ea ... Something
IMHO, itu bukan campuran, itu seperti find
berfungsi juga, bukan? AFAIK, menurut POSIX, sintaks seharusnya seperti
java --classpath ... --ea ... Something
dan -abcdef
akan berarti menentukan 6 opsi pendek sekaligus. Saya bertanya-tanya versi mana yang secara umum menyebabkan lebih sedikit pengetikan dan kesalahan.
Saya sedang menulis sebuah utilitas kecil di Jawa dan tidak akan menggunakan gaya Windows /a /b
karena saya tertarik terutama pada Unix. Gaya apa yang harus saya pilih?
java
unix
command-line
maaartinus
sumber
sumber
Jawaban:
Anda dapat menemukan konvensi argumen POSIX di bab Utilitas Konvensi . Gaya POSIX terdiri dari opsi dengan tanda hubung tunggal diikuti dengan huruf tunggal yang menunjukkan opsi, dengan nilai argumen dipisahkan dari opsi oleh spasi.
Ada pengecualian untuk aturan -
find
, misalnya - tetapi ini karena preseden Unix historis.X Windows (X11) menggunakan
find
opsi dasbor tunggal, seperti nama panjang.Opsi nama ganda dengan tanda hubung ganda dipelopori oleh GNU (setelah jalan memutar menggunakan
+
awalan).Lihat pertanyaan StackOverflow ini untuk diskusi tentang berbagai sistem penanganan argumen baris perintah yang dikenal - ada banyak. ( Karena ini ditulis, kekuasaan-yang-akan diputuskan pertanyaan SO 367.309 tidak cocok untuk SO. Saya sudah ditransfer jawaban untuk pertanyaan lain, Apa sintaks umum perintah Unix shell? . )
Anda dapat memperluas daftar teknik untuk mencakup
git
(dan sejumlah sistem lain) di mana Anda mendapatkan struktur seperti:basecommand
[ opsi global ]subcommand
[ opsi sub-perintah ] [nama ...]Mungkin ada banyak sub-perintah, masing-masing dengan leksikon opsi sendiri.
Tentu saja, Windows menggunakan slash '
/
' yang digunakan untuk mengindikasikan opsi alih-alih tanda hubung '-
'.JCL (untuk z / OS, dan OS / 360, dan sistem menengah) cenderung menggunakan parameter posisi yang dipisahkan oleh koma, dan umumnya dianggap tidak ramah pengguna atau antarmuka yang baik.
sumber
git
.EDIT: Telah ditunjukkan bahwa gaya ini adalah GNU-isme, dan Unix yang tidak berbasis GNU cenderung menggunakan sintaks garis tunggal (khususnya, varian OS X dan BSD).
Meskipun berstatus GNU-isme, banyak program gaya Unix yang baru ditulis menggunakan gaya ini:
--long-option
untuk nama opsi panjang,-s
untuk opsi pendek (satu karakter),-abc
untuk beberapa opsi pendek tanpa argumen (satu karakter per opsi).--long arg
atau--long=arg
untuk opsi lama,-s arg
,-sarg
atau (opsional)-s=arg
untuk opsi pendek. Ini dapat dikombinasikan dengan opsi pendek lainnya, selama hanya yang terakhir yang memiliki argumen.Siapa pun yang telah menggunakan shell Linux untuk jangka waktu berapa pun harus terbiasa dengan gaya 1 ini , sehingga memiliki prinsip kejutan paling tidak di sisinya. Membiarkan pengelompokan beberapa opsi pendek tanpa ambigu dengan opsi panjang juga bagus.
1 Misalnya, beberapa program menggunakan gaya ini (pada mesin Linux saya):
ls
,grep
,man
,sed
,bash
, dll ( EDIT: ini tampaknya GNU-isme meskipun, BSD dan OS X mesin tidak menggunakan gaya ini)Ada beberapa perpustakaan yang dapat menangani penguraian ini untuk Anda (yang paling terkenal adalah implementasi getopt dari GNU ), hanya membutuhkan Anda untuk menentukan opsi lama dan pendek yang ada, apakah mereka mengambil argumen, dan apa yang harus dilakukan ketika suatu Opsi ditemukan. (Dan tentu saja, apa yang harus dilakukan untuk argumen posisi, yaitu argumen yang tidak memulai
-
dan bukan argumen untuk opsi sebelumnya)find
adalah program yang sangat lama (atau mungkin lebih mungkin: versi yang ditulis ulang dari program yang sangat lama) yang tidak dapat dengan mudah diubah untuk menggunakan sintaks baris perintah baru. Terlalu banyak skrip akan rusak, dan terlalu banyak pengguna yang terbiasa dengan sintaksis lama akan mengeluh.javac
kemungkinan dipengaruhi olehgcc
dan teman-teman, yang juga mengikuti sintaks lama karena alasan historis.sumber
--long-arg
) adalah konvensi GNU (lihat implementasi getopt mereka ).Untuk proyek Java Anda, Anda mungkin ingin memeriksa GNU getopt untuk Java atau Apache CLI . Mereka mendukung kedua konvensi.
Opsi ketiga adalah menggunakan argumen Java VM dan membiarkan runtime menguraikannya untuk Anda:
Dan kemudian, dalam kode:
Secara pribadi, saya akan menggunakan
-D
idiom dan membungkus mantra Java dalam skrip shell yang menangani parsing baris perintah termasuk memeriksa classpath dll. Ini juga memudahkan pengguna asli untuk menjalankan program Java Anda.sumber
Tergantung. Saya pribadi lebih suka gaya POSIX, tetapi dalam kasus Anda saya mungkin akan bertujuan untuk konsistensi dengan lingkungan di mana alat Anda akan digunakan. Ini berarti menggunakan konvensi Java untuk JAR (kecuali jika Anda berencana untuk memiliki skrip wrapper yang akan membuatnya terlihat seperti perintah Unix yang khas).
sumber