Mengapa menggunakan dasbor superflous (-) untuk memberikan flag opsi ke tar?

35

Untuk membuat file tar untuk direktori, tarperintah dengan compress, verbosedan fileopsi dapat diketik dengan demikian:

$ tar -cvf my.tar my_directory/

Tetapi itu juga berfungsi untuk melakukannya dengan cara ini:

 $ tar cvf my.tar my_directory/

Artinya, tanpa tanda hubung (-) sebelum opsi. Mengapa Anda pernah memberikan tanda hubung (-) ke daftar opsi?

Milktrader
sumber

Jawaban:

43

Ada beberapa pola berbeda untuk opsi yang telah digunakan secara historis dalam aplikasi UNIX. Beberapa yang lama, seperti tar , menggunakan skema posisi:

argumen opsi perintah

seperti misalnya penggunaan tar

tar * sesuatu * f "file dioperasikan pada" * "path file untuk memanipulasi" *

Dalam upaya pertama untuk menghindari kebingungan, tar dan beberapa program lain dengan gaya flag-argumen lama diperbolehkan membatasi bendera dengan tanda hubung, tetapi kebanyakan dari kita orang tua mengabaikannya.

Beberapa perintah lain memiliki sintaks baris perintah yang lebih rumit, seperti dd (1) yang menggunakan flag, tanda sama, nama path, argumen dan partridge di pohon pir, semua dengan pengabaian liar.

Dalam BSD dan versi unix yang lebih baru, ini memiliki lebih atau kurang konvergen ke bendera karakter tunggal ditandai dengan '-', tetapi ini mulai menimbulkan beberapa masalah:

  • bendera-bendera itu mungkin sulit untuk diingat
  • terkadang Anda sebenarnya ingin menggunakan nama dengan '-'
  • dan terutama dengan alat-alat GNU, mulai ada batasan yang diberlakukan oleh jumlah bendera yang mungkin. Jadi alat GNU menambahkan opsi panjang GNU suka --output.

Kemudian Sun memutuskan bahwa ekstra '-' itu berlebihan dan mulai menggunakan bendera gaya-panjang dengan single '-'s.

Dan begitulah yang menjadi kekacauan sekarang.

Charlie Martin
sumber
9
"Dan ayam hutan di pohon pir" Lebih baik daripada upaya kering saya. Kamu menang.
dmckee
1
konteks sejarah yang bagus.
1
Saya perhatikan bahwa banyak program X (termasuk, katakanlah, X, dari Xorg), menggunakan flag gaya panjang dengan satu -. Apakah itu dari Sun?
mattdm
1
Apa arti dari 'ayam hutan di pohon pir'? (Dapatkah saya memiliki tautan yang berguna & mudah dipahami?)
plhn
1
@plhn Idiom. Sebuah lagu Natal tradisional Inggris "The Twelve Days of Christmas" mencantumkan sejumlah besar hadiah mewah, berakhir dengan "ayam hutan di pohon pir". Ini menunjukkan daftar mewah yang panjang.
Charlie Martin
8

Anda dapat memberikan opsi tar dengan cara unix standar di tar -c -f foo -v -B file1 file2 file3mana Anda memerlukan tanda hubung untuk membedakan antara opsi dan parameter atau nama file di akhir baris perintah. Atau Anda dapat menggabungkan semua opsi dalam argumen pertama, dalam hal ini tanda hubung adalah opsional.

Lalu ada ps, di mana Anda menggunakan tanda hubung jika Anda menggunakan opsi SysV-ish, dan tinggalkan mereka jika Anda menggunakan opsi BSD-ish, hanya untuk membuat hal-hal lebih membingungkan.

Dan mari kita tidak membicarakannya find.

Paul Tomblin
sumber
2

Tanda hubung digunakan untuk memisahkan antara opsi parameter nama dan nilai. Saya kira itu lebih dari konvensi standar.


sumber
1
Saya akan menambahkan best-practicetag karena saya pikir itu mungkin karena itu.
1
@Milktrader, ini pertanyaan sulit ketika berbicara tentang praktik terbaik. Mengikuti konvensi standar memang praktik terbaik, tetapi apakah Anda ingin melakukannya dalam kasus Anda, itu tidak jelas. Itu akan tergantung pada skenario Anda. Jika Anda meretas beberapa perintah cepat di shell Anda mungkin tidak akan terlalu peduli tentang hal itu tetapi jika Anda menulis perpustakaan, penting untuk mengikuti konvensi yang mapan karena Anda tidak memiliki kontrol tentang bagaimana perpustakaan ini akan digunakan oleh klien. Dalam hal ini Anda harus membahas semua kemungkinan kasus dan menyatukan antara nama opsi dan nilai adalah penting.
-1

Ada hingga empat konvensi untuk menggunakan opsi baris perintah unix:

  1. -o -p -t (dash sebelum setiap opsi)
  2. -opt (dash sebelum set pilihan)
  3. opt (tanpa tanda henti sebelum serangkaian opsi)
  4. --long-option (tanda hubung ganda di depan nama opsi)

Sebagai contoh:

$ tar -x -v -z -f package.tar.gz
$ tar -xvzf package.tar.gz
$ tar xvzf package.tar.gz
$ tar --extract -verbose -gzip -file package.tar.gz
jonasjacek
sumber
1
Apakah konvensi itu hanya berlaku untuk tar? Bagaimana dengan ls? ls lrt tidak akan bekerja tetapi ls-lrt / ls -l -r -t akan bekerja. Kenapa begitu?
Shashank Vyas
Keempat konvensi harus bekerja untuk semua perintah.
jonasjacek
2
Tidak, mereka tidak. Suatu hari saya mencoba rm rf <nama file>, itu juga tidak berhasil.
Shashank Vyas
-2

Dengan tanda minus / tanda hubung (-) Anda harus menjaga agar opsi tetap dalam urutan yang akurat. Tanpa minus urutan opsi Anda dapat berubah.

Sebagai contoh:

# tar -xvf yourfile.tar
# tar vxf yourfile.tar
Mohd. Golam Hossain
sumber
Jawaban ini setengah benar, tetapi AFAIK hanya berbunyi seperti fitu yang mengambil argumen yang urutannya penting. Lihat unix.stackexchange.com/a/239120/3169
Mikel