Apa perbedaan antara satu-dasbor dan dua-dasbor untuk parameter prompt perintah?

65

Saya bertanya-tanya mengapa beberapa program memerlukan parameter command prompt mereka untuk memiliki dua tanda hubung di depan sedangkan beberapa (sebagian besar) hanya memerlukan satu tanda hubung di depan?

Misalnya sebagian besar program terlihat seperti ini: relaxer -dtd toc.xml toc_gr.xml toc_jp.xml

Sedangkan beberapa program terlihat seperti ini: xmllint --valid toc.xml --noout

Apa alasan beberapa orang membutuhkan dua tanda hubung bukan satu? Bukankah masuk akal bagi semua orang untuk tetap berpegang pada satu standar (yaitu satu tanda hubung akan dilakukan).

Pacerier
sumber
10
> Bukankah masuk akal bagi semua orang untuk berpegang pada satu standar - ya. Apakah semua programmer mematuhi standar dan menjaga konsistensi? Tidak. Banyak programmer bahkan tidak dapat mempertahankan konsistensi dalam program mereka :) Karena itu, konsensusnya adalah menggunakan satu tanda hubung hanya untuk opsi satu huruf, dan dua tanda hubung untuk semua yang sebenarnya adalah kata-kata, misalnya -ivs. --inputatau -n --dry-run.
slhck
1
@ slhck Heys terima kasih atas bantuannya =) Dengan konvensi itu, apakah itu berarti bahwa -dtdseharusnya memang demikian --dtd? Efektif apa yang saya bertanya-tanya tentang adalah apa yang dasbor (dan double-dash) mencoba untuk menandakan?
Pacerier
6
Untuk poin bonus: program yang sesuai dengan standar Gnu untuk --long-optionsakan menerima singkatan unik juga. Jadi, untuk program dengan opsi --file-indan --file-out, Anda dapat menggunakan --file-o=fooatau --file-i=foo, yang dapat menghemat pengetikan --very-long-optional-parameters.
BRPocock
GNU datang bersama dengan konvensi mereka menggunakan dua strip untuk "lama" pilihan, yang kebetulan aku suka, tapi banyak utilitas yang lebih tua, seperti yang dibundel dengan X Window System, serta ImageMagick ( misalnya , convert, mogrify) memiliki "panjang" opsi hanya menggunakan satu tanda hubung. Sebagai contoh: xterm -fn 6x10 -geometry 80x24+30+200. Singkatan didukung, asalkan berbeda ( misalnya , -gatau -geomuntuk -geometry). Lihat X (7) untuk contoh lainnya.
TheDudeAbides

Jawaban:

18

Lakukan saja ls --help dan lihat opsi; itu harus jelas bagi Anda.

Ini tidak ada hubungannya dengan parameter sama sekali. Banyak opsi memiliki bentuk pendek dan panjang, dan banyak yang memiliki satu dan bukan yang lain.

Dan juga, mengenai parameter, hanya saja dalam bentuk panjang ketika mereka mengambil parameter sepertinya selalu sama dengan. Tapi jelas yang pendek bisa mengambil parameter sama banyaknya; hanya saja mereka tidak menggunakan yang sama.

Berikut adalah kutipan dari ls --help( man lsmemberikan informasi yang setara). Perhatikan bagaimana beberapa memiliki bentuk panjang tanpa bentuk pendek ( --author, --block-size), beberapa memiliki bentuk pendek tanpa bentuk panjang ( -c, -f, -g), dan beberapa memiliki kedua bentuk panjang dan bentuk pendek ( -A/ --almost-all, -b/ --escape).

 -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 ~
 -c                         with -lt: sort by, and show, ctime (time of last
                              modification of file status information)
                              with -l: show ctime and sort by name
                              otherwise: sort by ctime
 -C                         list entries by columns
     --color[=WHEN]         control whether color is used to distinguish file
                              types.  WHEN may be `never', `always', or `auto'
barlop
sumber
4
Bagaimana cara kita melakukan ls --helppada windows?
Pacerier
1
@Pacerier Tidak ada lsdi Windows. Perintah yang setara adalah dir /?. Anda menggunakan perangkat lunak lintas platform yang melanggar konvensi Windows yang biasa, lihat jawaban saya.
Daniel Beck
@Pacerier Ini bukan bawaan, tetapi unduh pihak ketiga, Gnuwin32 Anda mengunduhnya (google gnuwin32). ada banyak paket di dalam gnuwin32 masing-masing dengan perintah, unduh paket coreutils, yang memiliki banyak perintah umum.
barlop
Ada opsi panjang tanpa opsi pendek di ls --helpkutipan Anda . Lihat --authordan --block-size.
Dan
Untuk menjawab pertanyaan dalam komentar asli @ Pacerier: Cara paling umum sistem Windows modern mendapatkan lsperintah adalah melalui GIT . GIT bash shell atau CMD window dengan GIT bin di PATH akan miliki ls.
yzorg
34

Tidak ada standar luas. Ada beberapa konsistensi misalnya dalam program GNU, tetapi Anda perlu memeriksa dokumentasi masing-masing program.

Mengutip Wikipedia , beri penekanan pada saya:

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.

Biasanya, tanda hubung menunjukkan argumen yang telah ditentukan. Saya pikir ini digunakan untuk membedakan mereka dari misalnya nama file atau label lain yang mungkin Anda gunakan sebagai argumen. Tapi itu tidak selalu terjadi (lihat di bawah).


Anda akan sering menemukan argumen yang sama tersedia sebagai opsi pendek dan panjang, seperti misalnya di ls .

Beberapa program menggunakan tanda hubung tunggal untuk opsi satu karakter, dan dua tanda hubung untuk opsi multi-karakter, tetapi tidak semua (GNU finddatang ke pikiran). Beberapa program memiliki tanda hubung opsional atau lewati semuanya ( taratau BSD psmuncul di benak Anda).

Terkadang opsi panjang ( --foo) memerlukan argumen, sedangkan opsi pendek ( -f) tidak (atau setidaknya menyiratkan argumen default tertentu).

Opsi pendek (mis. cut -d ' ') Dapat memiliki argumen, sedangkan opsi panjang (mis. ls --all) Tidak selalu memilikinya.

Untuk mengatur perilaku tertentu dari suatu program, Anda kadang-kadang perlu menggunakan opsi pendek, untuk yang lain Anda perlu menggunakan opsi panjang, dan untuk beberapa Anda punya pilihan.

Pada catatan terkait, beberapa program tidak dapat menangani spasi kosong antara opsi dan argumennya , sementara yang lain tidak.

Seperti yang saya tulis di awal, tidak ada perilaku atau standar umum. Seringkali Anda dapat melacak perilaku serupa ke pustaka yang sama yang digunakan untuk parsing argumen, tetapi Anda mungkin tidak ingin membaca sumber untuk mengetahui hal ini.

Anda benar-benar tidak dapat menyimpulkan sintaks argumen satu program dari yang lain.


Jika Anda juga mempertimbangkan Windows, itu menjadi lebih buruk: Sementara baris perintah Windows secara tradisional menggunakan panggilan /f(setidaknya sebagian besar waktu, karakter tunggal) untuk opsi, dengan :sebagai pemisah antara opsi dan nilainya (lihat misalnya di sini ); utilitas lintas platform tersebar luas (seperti yang Anda sebutkan) dan membawa sintaks tanda hubung yang lebih umum untuk argumen, dengan semua inkonsistensi yang disebutkan di atas.

Daniel Beck
sumber
2
Perlu dicatat bahwa pustaka standar GNU menyediakan fungsionalitas memetakan opsi satu-minus-satu-huruf, dua-minus-multi-huruf, sehingga semua program GNU baru dan sebagian besar perangkat lunak bebas baru secara umum menggunakan notasi ini (misalnya - f, -f foo, --file, --file foo, --file = foo, --fil = foo, --fi = foo); throwbacks seperti tar, ps, finddan seperti memiliki sintaks baris perintah mereka ditetapkan oleh POSIX sebelum standar ini telah benar-benar gel. Pada sistem Gnu / Linux, ini adalah taruhan yang cukup aman bahwa setidaknya --helpakan (hampir) selalu didukung, dan man <command>atauinfo <command>
BRPocock
apakah standar GNU mengatakan bahwa Anda seharusnya tidak memiliki formulir pendek tanpa formulir panjang dan tidak boleh memiliki panjang tanpa formulir pendek?
barlop
+1 sebagai jawaban paling lengkap, termasuk penyebutan GNU findyang tidak mengikuti "konvensi GNU" untuk opsi panjang (mungkin karena alasan kepatuhan POSIX, seperti yang ditunjukkan oleh @BRPocock). Saya akan memberi +1 lagi jika saya bisa, untuk menyebutkan baris perintah DOS / Windows "switch", karena pertanyaan OP entah bagaimana diberi tag "windows," dan konvensi itu harus disebutkan untuk kelengkapannya.
TheDudeAbides
7

Ini adalah konvensi yang berasal dari * nix. Tanda hubung ganda mendahului opsi ketika mereka ditulis penuh ,, sedangkan tanda hubung tunggal mendahului opsi ketika mereka ditulis dalam bentuk pendek . Misalnya ls --all --l, bisa disingkat menjadi ls -al. Seperti yang terlihat, tidak semua opsi memiliki padanan satu huruf, meskipun lebih banyak digunakan biasanya.

Apakah opsi mengambil argumen tidak benar-benar membuat perbedaan - itu bisa mengambil mereka, atau tidak mengambil mereka, terlepas dari cara Anda memasukkan opsi.

Ketika menulis mereka untuk penggunaan satu kali, itu tidak masalah, tetapi ketika menulis perintah misalnya dalam file .alias, biasanya menggunakan formulir lengkap. Murni untuk kemudahan membaca untuk orang selanjutnya.

Benteng
sumber
Heys terima kasih atas bantuannya, Btw apakah ada alasan Anda mengetik unix sebagai * nix?
Pacerier
2
@Pacerier - Unix adalah nama dagang. Dengan mengetikkan * nix, saya sebenarnya merujuk ke semua sistem unix dan sejenis, yang untuk semua tujuan praktis, adalah sama. Tapi sebagian besar, itu adalah kekuatan kebiasaan ...
Rook
2
@Pacerier * nix dapat merujuk ke Linux, atau Unix. Saya tidak sepenuhnya yakin tentang ini karena beberapa waktu yang lalu saya melihatnya, tetapi secara teknis, jika saya ingat, BSD berasal dari keluarga Unix. Linux secara teknis tidak .. dan FreeBSD juga tidak. Tetapi mengatakan * nix akan mencakup unix / bsd, dan hal-hal seperti itu, misalnya linux dan freebsd.
barlop
2
+1 untuk menyebutkan penggabungan perintah steno. itulah alasan sebenarnya mengapa ada dua gaya.
Ryan_S
3

ini adalah sintaks UNIX konvensional,

argumen program membutuhkan satu tanda hubung ("-") diikuti dengan satu huruf ketika itu adalah pilihan sederhana (misalnya: -v ) dan dua tanda hubung ("-") ketika opsi tersebut mengambil argumen (misalnya: --file toc.xml atau --file = toc.xml )

tidak berdampak pada fungsionalitas program.


sumber
3
Juga, dalam banyak kasus dengan opsi huruf tunggal mengikuti tanda hubung tunggal, Anda dapat mengelompokkan huruf-huruf tersebut bersama-sama. Misalnya, "ls -al" sama dengan "ls -a -l". Opsi dasbor ganda tidak dapat digabungkan dengan cara ini. Opsi huruf tunggal adalah standar yang lebih lama, tetapi hari ini banyak perintah akan mengambil kedua jenis. Misalnya "ls --all" sama dengan "ls -a".
Randy Orrison
3
Sebenarnya, koreksi lagi. Single-dash opsi satu huruf dapat mengambil parameter, tetapi biasanya tidak ditautkan dengan tanda sama dengan. Misalnya, "tail -n 50" menunjukkan 50 baris terakhir file, setara dengan "tail --lines = 50".
Randy Orrison
Dengan konvensi ini, apakah ini berarti bahwa --noout(dalam pertanyaan di atas) seharusnya benar-benar ditulis -nooutkarena tidak memiliki argumen ?
Pacerier
1
apa yang dikatakan dalam jawaban ini tentang parameter sama sekali salah. Kalimat pertama jelas. Kalimat terakhir jelas. Dan paragraf di tengah yang seharusnya menjawab pertanyaan, sama sekali salah.
barlop
@RandyOrrison ketika satu huruf saya belum pernah melihat tanda sama dengan .. dan untuk menguraikan poin Anda, mereka sering mengambil parameter .. wget -w 10 head -n 3 cut -b 2 Dan lihat Ping -? !! Banyak mengambil parameter. Jawaban ini mengerikan
barlop
3

dash tunggal diimplementasikan oleh getopt dan merupakan fungsi standar posix , double dash di getopt_long dan merupakan standar gnu.

Secara tradisional, tanda hubung tunggal memasok opsi karakter tunggal seperti ini:

-A atau -V dll tetapi tidak perlu dibatasi untuk itu. mis. -Wall for gcc mengaktifkan semua peringatan compiler untuk perintah compiler gcc.

argumen dasbor ganda cenderung lebih verbose dan sering mengambil parameter yang disediakan seperti --max-count = NUM. Namun, --versi tidak ada bandingannya.

Secara umum, tidak ada aturan atau standar yang ditetapkan tentang bagaimana argumen program harus ditentukan, hanya sekelompok tradisi. Namun, jika fungsi parsing baris perintah getopt dan getopt_long digunakan maka parameter umumnya harus mengikuti standar sebagai fungsi perpustakaan menegakkan cara tertentu untuk melakukannya.

Matt H
sumber