Tanda hubung tunggal `-` untuk opsi karakter tunggal, tetapi tanda hubung ganda` --` untuk kata-kata?

51

Dari mana konvensi menggunakan tanda hubung tunggal untuk huruf dan tanda hubung ganda untuk kata-kata berasal dan mengapa terus digunakan?

Misalnya jika saya mengetik ls --help, Anda melihat:

  -a, --all                  do not ignore entries starting with .
  -A, --almost-all           do not list implied . and ..
      --author               with -l, print the author of each file
  -b, --escape               print octal escapes for nongraphic characters
      --block-size=SIZE      use SIZE-byte blocks
  -B, --ignore-backups       do not list implied entries ending with ~
...

Saya mencoba googling - and -- conventionbahkan dengan kutipan dengan sedikit keberhasilan.

Larry
sumber
6
Hanya menjadi rewel di sini, tetapi karakter -secara teknis disebut tanda hubung . Kami menggunakan kata "tanda hubung" untuk merujuk ke tanda hubung em (-) dalam banyak kasus, dan terkadang tanda hubung en (-), tetapi tidak ada yang merupakan tanda hubung (-).
chharvey
4
Itu benar-benar mengganggu saya ketika program terkenal tidak mengikuti konvensi, meskipun:java -version
Kimberly W
4
@ Jamil Ya. Saya berakhir di sini bertanya-tanya mengapafind . -delete
Krzysztof Wende
Gagasannya adalah agar Anda dapat menulis hal-hal seperti -abyang mengaktifkan keduanya adan b. Tanpa dasbor ganda, -helpakan mengaktifkan h, e, l, dan ppilihan.
Aaron Franke

Jawaban:

61

Dalam The Art of Unix Programming, Eric Steven Raymond menjelaskan bagaimana praktik ini berkembang:

Dalam tradisi Unix yang asli, opsi baris perintah adalah huruf tunggal yang didahului dengan satu tanda hubung ... Gaya Unix yang asli berevolusi pada teletipe ASR-33 yang lambat yang menjadikan keleness suatu kebajikan; dengan demikian opsi huruf tunggal. Menahan tombol shift memerlukan upaya nyata; dengan demikian preferensi untuk huruf kecil, dan penggunaan "-" (daripada "+" yang mungkin lebih logis) untuk mengaktifkan opsi.

Gaya GNU menggunakan kata kunci opsi (bukan huruf kata kunci) yang didahului oleh dua tanda hubung. Itu berevolusi bertahun-tahun kemudian ketika beberapa utilitas GNU yang agak rumit mulai kehabisan tombol opsi satu huruf ( ini merupakan patch untuk gejala, bukan obat untuk penyakit yang mendasarinya ). Ini tetap populer karena opsi GNU lebih mudah dibaca daripada sup alfabet gaya lama. 1

[1] http://www.faqs.org/docs/artu/ch10s05.html

jasonwryan
sumber
Perhatikan bahwa getopt () pertama kali diterbitkan pada tahun 1985, tetapi UNOS (klon UNIX tertua) menerbitkan getargs () pada tahun 1982 (ditulis pada tahun 1980) dan getargs () mendukung opsi pendek dan opsi dash panjang tunggal (gaya Multics). UNOS secara besar-besaran menggunakan opsi dash panjang tunggal dan UNOS ditulis oleh mantan karyawan AT&T. Pada tahun 1988, GNU keluar dengan opsi dasbor ganda, meskipun UNOS memverifikasi bahwa opsi dasbor panjang bekerja dengan baik.
schily
28

Salah satu alasan untuk terus menggunakan opsi huruf adalah karena mereka dapat dirangkai: ls -ltradalah banyak lebih mudah untuk mengetik dari ls --sort=time --reverse --format=long. Ada beberapa kali saat keduanya bagus untuk digunakan. Sedangkan untuk mencari topik ini, cobalah "unix command line options convention".

Arcege
sumber
1
+1 Terima kasih ini benar-benar membantu dengan logika di balik implementasi.
Larry
Karena UNIX tidak mengerti ls --sort=time --reverse --format=long, tidak baik untuk menyebutkan metode yang tidak standar ini.
schily
6

The kutipan dari Raymond oleh @jasonwryan memiliki beberapa informasi yang berguna, tetapi dimulai di tengah-tengah cerita:

  • Ingatlah bahwa Unix dimulai sebagai versi Multics yang diperkecil, dan sepanjang sejarahnya, fitur-fitur di Unix sering kali merupakan tiruan atau adaptasi dari fitur yang dilihat dan digunakan pada sistem lain.
  • The '-'karakter pilihan digunakan dalam Multics. Bitsavers memiliki manual untuk perintah penggunanya .
  • Sistem lain menggunakan karakter yang berbeda, beberapa dengan lebih banyak mengklaim lebih hemat keystroke (seperti '/'digunakan untuk TOPS dan VMS) dan beberapa lainnya kurang (seperti '('digunakan dalam VM / SP CMS).
  • Opsi multikota bersifat multi-karakter, mis., Kata kunci dipisahkan oleh garis bawah.
  • Opsi Multics yang lebih panjang sering kali memiliki bentuk yang lebih pendek dan disingkat, seperti -printvs -pr(halaman 3-8).
  • Opsi Unix adalah karakter tunggal, dan setelah beberapa tahun, getoptdiperkenalkan. Karena itu bukan bagian dari Unix asli, ada utilitas yang tidak menggunakan getoptdan dibiarkan apa adanya. Tetapi setelah getoptmembantu membuat program konsisten.

Di sisi lain, opsi Unix menggunakan getoptkarakter tunggal. Sistem lain, khususnya yang lebih besar, menggunakan kata kunci. Beberapa (tidak semua) mengizinkan kata kunci tersebut disingkat , yaitu, tidak semua karakter disediakan selama opsi tidak ambigu. Ada jebakan dalam tes ambiguitas itu. Sebagai contoh:

  • awal tahun 1985, saya mengerjakan sebuah program yang harus porting ke PrimOS . Pengembang Prime bersaing dengan beberapa perusahaan lain dengan menawarkan bahasa perintah yang (mencoba) meniru masing-masing, memberikan perintah yang paling umum digunakan dari masing-masing. Tentu saja, mereka mendukung singkatan (seperti yang dilakukan VMS). Setelah membaca bantuan online, saya mengetik sta, berpikir untuk mendapatkannya status. Itu adalah singkatan dari start, dan setelah tidak memberikan apa-apa untuk memulai , penerjemah perintah mengeluarkan saya.
  • X Toolkit (digunakan oleh xterm ) memungkinkan opsi yang disingkat. Untuk menggunakan ini secara efektif dalam xterm, ia harus preprocess parameter perintah untuk memilih -v(untuk versi) daripada -vb(bel visual). X Toolkit tidak memiliki cara langsung untuk menentukan opsi yang disukai ketika ada ambiguitas.

Karena potensi ambiguitas ini, beberapa pengembang memilih untuk tidak mengizinkan singkatan. Lynx , misalnya, menggunakan opsi multi-karakter tanpa mengizinkan singkatan.

Tidak semua program digunakan getopt: tardan pstidak. Juga tidak rcs(atau sccs), seperti yang Anda lihat dengan mencatat di mana tanda hubung adalah opsional, dan nilai opsi adalah opsional.

Dengan mempertimbangkan semua ini, pengembang GNU mengadaptasi opsi kata kunci yang digunakan dalam sistem lain dengan memperluas getoptuntuk menyediakan versi panjang dari setiap opsi pendek. Misalnya, textutils 1.0 changelog berkata

Tue May  8 03:41:42 1990  David J. MacKenzie  (djm at abyss)

        * tac.c: Use regular expressions as the record boundaries.
        Give better error messages.
        Reformat code and make it more readable.
        (main): Use getopt_long to parse options.

Perubahan dalam fileutils sebelumnya:

Tue Oct 31 02:03:32 1989  David J. MacKenzie  (djm at spiff)

        * ls.c (decode_switches): Add long options, using getopt_long
        instead of getopt.

dan seseorang mungkin menemukan yang lebih awal, tetapi tampaknya file-header menunjukkan tanggal paling awal:

/* Getopt for GNU.
   Copyright (C) 1987, 1989 Free Software Foundation, Inc.

yang (misalnya) bersamaan dengan X Toolkit (1987). Sebagian besar utilitas Unix yang Anda kenal (seperti ls, ps) menggunakan opsi karakter tunggal yang ada yang memerlukan kunjungan berkala ke manual. Saat memperkenalkan getopt_long, pengembang GNU tidak melakukan ini dengan terlebih dahulu menambahkan opsi baru; mereka mulai dengan tabulasi opsi yang ada dan memberikan opsi panjang yang cocok.

Karena mereka menambah repertoar yang ada, ada (lagi) masalah konflik dengan opsi yang ada. Untuk menghindari ini, mereka mengubah sintaks, menggunakan dua tanda hubung sebelum opsi panjang.

Program-program ini terus digunakan getopt_longdengan cara ini untuk alasan yang biasa:

  • skrip bergantung pada opsi; pengembang tidak ingin merusak skrip
  • ada standar pengkodean tertulis (yang mungkin efektif)
  • tidak ada yang datang dengan seperangkat alat bersaing yang sangat tidak kompatibel (baik BSD dan pengembang GNU menyalin nama opsi dari satu sama lain)
Thomas Dickey
sumber
3

Dalam antarmuka baris perintah wikipedia dilaporkan:

Dalam sistem mirip Unix, tanda hubung ASCII biasanya digunakan untuk menentukan opsi. Karakter biasanya diikuti oleh satu atau lebih huruf. Argumen yang merupakan tanda hubung tunggal dengan sendirinya tanpa huruf apa pun biasanya menentukan bahwa suatu program harus menangani data yang berasal dari input standar atau mengirim data ke output standar. Dua karakter tanda hubung – minus (-) digunakan pada beberapa program untuk menentukan "opsi panjang" di mana nama opsi yang lebih deskriptif digunakan. Ini adalah fitur umum dari perangkat lunak GNU.

enzotib
sumber
Ini tidak menjawab pertanyaan dari mana konvensi itu berasal dan mengapa itu terus digunakan.
chharvey
1

Dugaan saya adalah bahwa opsi yang lebih deskriptif diinginkan dan juga dengan opsi yang lebih lama Anda tidak perlu khawatir kehabisan opsi karakter tunggal.

Setelah Anda memutuskan ingin opsi panjang, Anda memiliki masalah, setidaknya jika Anda berencana untuk mendukung opsi panjang dan pendek. Saya tidak positif, tetapi saya yakin jawaban arcege memegang kunci mengapa - dan -. Rutin pemrosesan generik, misalnya. getopt_long (), perlu tahu apakah argumen baris perintah tunggal dapat berisi beberapa opsi, mis. -ltr. Dengan demikian suatu rutinitas pemrosesan perlu dapat membedakan antara keduanya. Jika saya membaca tanda hubung tunggal, -, maka sisa argumen baris perintah dapat cocok dengan beberapa opsi. Jika saya membaca tanda hubung ganda, -, maka sisa argumen baris perintah harus cocok dengan satu opsi.

Saya baru saja menggunakan getopt_long () dan saya mulai menyukai opsi panjang karena lebih mudah diingat dan didokumentasikan sendiri. Jika saya memiliki dua perintah berikut:

./aggregator -f 15

./aggregator - flush-time 15

Saya akan mengatakan yang kedua menggunakan opsi panjang lebih jelas.

nickdu
sumber
0

Mungkin ada beberapa alasan mengapa kedua metode ini digunakan. Satu, tentu saja, adalah tradisi. Pemrogram dan pengguna adalah manusia, dan manusia mengharapkan sesuatu berfungsi dengan cara tertentu. Jika tidak ada alasan untuk berubah (dan sungguh, untuk baris perintah, tidak ada banyak alasan untuk berubah), maka jangan.

Yang sedang berkata, saya tahu bahwa ada alat di luar sana yang menggunakan tanda hubung tunggal untuk opsi yang panjang, atau bahkan menyingkirkan tanda hubung sama sekali. Alat-alat ini mungkin sulit pada awalnya, dan cenderung menonjol sebagai kutil dalam sistem yang tidak disatukan.

Ketika saya mempelajari perbedaan antara keduanya (dan sebelum menjadi sifat kedua), saya akan selalu ingat bahwa tanda hubung "pendek" cocok dengan opsi "pendek", sedangkan tanda hubung "panjang" (atau ganda) cocok dengan tanda "panjang" pilihan. Saya tidak tahu apakah alasan itu digunakan dalam pengembangan gaya tanda hubung ganda, tapi itu kemungkinan.

Kevin Lacquement
sumber