Sebagai contoh:
xargs -n 1
sama dengan
xargs -n1
Tetapi jika Anda melihat halaman manual, opsi terdaftar sebagai -n max-args
, yang berarti ruang seharusnya dipertahankan. Tidak ada tentang bentuk disingkat -n max-args .
Ini juga terjadi dengan banyak utilitas Linux lainnya.
Apa ini namanya di Linux? Apakah semua utilitas mendukung formulir yang disingkat (tetapi tidak pernah mendokumentasikannya di halaman manual)?
Jawaban:
Saat Anda menulis sedikit baris perintah parsing kode Anda, Anda menentukan opsi apa yang mengambil argumen dan mana yang tidak. Misalnya, dalam skrip shell yang menerima
-h
opsi (untuk bantuan misalnya) dan-a
opsi yang harus mengambil argumen, Anda lakukanThe
a:h
bit mengatakan "Saya mengharapkan untuk mengurai dua pilihan,-a
dan-h
, dan-a
harus mengambil argumen" (itu adalah:
setelaha
yang memberitahu parser yang-a
mengambil argumen).Oleh karena itu, tidak pernah ada ambiguitas di mana opsi berakhir, di mana nilainya dimulai, dan di mana yang lain dimulai setelah itu.
Menjalankannya:
Inilah sebabnya mengapa Anda sebagian besar waktu seharusnya tidak menulis parser baris perintah Anda sendiri untuk opsi parse.
Hanya ada satu kasus dalam contoh ini yang rumit. Penguraian biasanya berhenti pada opsi pertama, jadi ketika Anda memiliki item di baris perintah yang terlihat seperti opsi:
Berikut ini memecahkan itu:
The
--
sinyal mengakhiri opsi baris perintah, dan-world
bit yang tersisa untuk program untuk melakukan apapun yang diinginkan dengan (itu di salah satu variabel posisi).Omong-omong, bagaimana Anda menghapus file yang memiliki tanda hubung di awal nama file-nya
rm
.EDIT :
Utilitas yang ditulis dalam panggilan C
getopt()
(dinyatakan dalamunistd.h
) yang bekerja dengan cara yang hampir sama. Bahkan, untuk semua yang kita tahu,bash
fungsigetopts
tersebut dapat diimplementasikan menggunakan panggilan ke fungsi C librarygetopt()
. Perl, Python dan bahasa lain memiliki parsing pustaka baris perintah yang sama, dan kemungkinan besar parsing mereka lakukan dengan cara yang sama.Beberapa ini
getopt
dangetopt
-seperti rutinitas perpustakaan juga menangani "lama" pilihan. Ini biasanya didahului dengan double-dash (--
), dan opsi panjang yang mengambil argumen sering melakukannya setelah tanda sama dengan, misalnya--block-size=SIZE
opsi [beberapa implementasi]du
utilitas (yang juga memungkinkan untuk-B SIZE
menentukan hal yang sama).Alasan mengapa manual sering ditulis untuk menunjukkan ruang di antara opsi pendek dan argumen mereka mungkin untuk dibaca.
EDIT : Alat yang benar - benar tua, seperti
dd
dantar
utilitas, memiliki opsi tanpa tanda hubung di depannya. Ini murni karena alasan historis dan untuk menjaga kompatibilitas dengan perangkat lunak yang bergantung pada mereka untuk bekerja dengan cara seperti itu. Thetar
utilitas telah memperoleh kemampuan untuk mengambil pilihan dengan strip di kali yang lebih baru. Manual BSD untuktar
panggilan opsi gaya lama untuk "bundled flags".sumber
getopt()
(dinyatakan dalamunistd.h
), yang melakukan hal yang sama.-a -b
===-ab
-a
memiliki argumen opsional,-ab
tidak sama dengan-a -b
). GNU getopt tidak menghentikan pemrosesan flag saat bertemu dengan non-flag: sebagai gantinya (secara default), ia malah merombak flag ke bagian depan argv.xargs
adalah salah satu utilitas POSIX. Seperti dikomentari oleh @drewbenn, POSIX mendokumentasikan perilaku parsing opsi untuk sebagian besar utilitasnya agar sesuaigetopt
, dengan beberapa kelonggaran untuk implementasi lainnya, mengatakan dalam 12.1 Utilitas Sintaks Argumen Sintaks :dan menyimpulkan dengan
Di dalam POSIX (ingat bahwa itu hanya mencakup utilitas yang paling umum digunakan), ada pengecualian yang melewati operan yang akan menjadi opsi di utilitas lain sebagai parameter posisional , atau parameter dengan sintaks khusus :
POSIX memungkinkan untuk opsi-nilai opsional :
Begitu saja, saya tidak ingat utilitas POSIX mana yang menggunakan fitur ini. Ncurses
tic
daninfocmp
utilitas menggunakan fitur untuk level opsi-v
(verbose / debug).Poin spesifik yang Anda tanyakan terperinci dalam sisa paragraf itu, berlangsung beberapa baris.
Sebelum POSIX, beberapa implementasi dari
ps
opsi yang diterima tanpa tanda hubung terkemuka. Deskripsi POSIX tidak menyebutkan bahwa dalam deskripsi utilitas atau dalam alasan sintaksis:Selain POSIX, ada implementasi opsi-panjang (seperti GNU getopt_long , atau X Toolkit ), menggunakan berbagai cara untuk memisahkan atau menggabungkan nilai opsi ke opsi. Misalnya, tanda baca dapat digunakan:
Bergantung pada implementasinya, dasbor ganda dapat / mungkin tidak digunakan untuk membedakan opsi panjang dari pendek (getopt): lynx dan X Toolkit menggunakan dasbor tunggal; GNU
getopt_long
menggunakan tanda hubung ganda, misalnya. Juga, a+
dapat digunakan untuk menunjukkan bahwa opsi dinegasikan.Deskripsi POSIX tampaknya tidak menyebutkan semua ini, tetapi Anda pasti akan menemui mereka.
sumber
-option=value
seharusnya--option=value
(format lama-pilihan, dua strip di awal bukan satu)?