Diutamakan dari opsi perintah?


21

Saya tahu bahwa rm -f file1secara paksa akan menghapus file1tanpa meminta saya.

Saya juga tahu bahwa rm -i file1akan meminta saya terlebih dahulu sebelum menghapusfile1

Sekarang jika Anda mengeksekusi rm -if file1, ini juga akan dengan paksa menghapus file1tanpa meminta saya.

Namun, jika Anda mengeksekusi rm -fi file1, itu akan meminta saya sebelum menghapus file1.

Jadi apakah benar bahwa ketika menggabungkan opsi perintah, yang terakhir akan diutamakan? seperti rm -if, maka -fakan diutamakan, tetapi -fikemudian -iakan diutamakan.

The lsperintah misalnya, tidak masalah jika Anda mengatakan ls -latRatau ls -Rtal.

Jadi saya kira itu hanya masalah ketika Anda memiliki opsi perintah yang bertentangan seperti rm -if, apakah itu benar?


Jawaban:


23

Saat menggunakan rmkeduanya -idan -f opsi, yang pertama akan diabaikan. Ini didokumentasikan dalam standar POSIX :

    -f
       Do not prompt for confirmation. Do not write diagnostic messages or modify
       the exit status in the case of nonexistent operands. Any previous
       occurrences of the -i option shall be ignored.
    -i
       Prompt for confirmation as described previously. Any previous occurrences
       of the -f option shall be ignored.

dan juga di infohalaman GNU :

‘-f’
‘--force’

    Ignore nonexistent files and missing operands, and never prompt the user.
    Ignore any previous --interactive (-i) option.

‘-i’
    Prompt whether to remove each file. If the response is not affirmative, the
    file is skipped. Ignore any previous --force (-f) option.

Mari kita lihat apa yang terjadi di bawah tenda:

rmmemproses opsinya dengan getopt(3), khususnya getopt_long. Fungsi ini akan memproses argumen opsi di baris perintah ( **argv) sesuai urutan tampilan:

Jika getopt () dipanggil berulang kali, ia akan mengembalikan setiap karakter opsi dari setiap elemen opsi secara berurutan.

Fungsi ini biasanya disebut dalam satu lingkaran sampai semua opsi diproses. Dari perspektif fungsi ini, opsi diproses secara berurutan. Apa yang sebenarnya terjadi, bagaimanapun, adalah ketergantungan aplikasi, karena logika aplikasi dapat memilih untuk mendeteksi opsi yang bertentangan, menimpanya, atau menyajikan kesalahan. Untuk kasus rmdan idan fpilihan, mereka sempurna menimpa eachother. Dari rm.c:

234         case 'f':
235           x.interactive = RMI_NEVER;
236           x.ignore_missing_files = true;
237           prompt_once = false;
238           break;
239 
240         case 'i':
241           x.interactive = RMI_ALWAYS;
242           x.ignore_missing_files = false;
243           prompt_once = false;
244           break;

Kedua opsi mengatur variabel yang sama, dan keadaan variabel ini akan menjadi opsi mana yang terakhir di baris perintah. Efek dari ini sejalan dengan standar POSIX dan rmdokumentasi.


3
Sebagian besar perintah memproses argumen mereka secara berurutan, dan salah pada konflik atau mengambil pengaturan terakhir (seperti rm). Saya pikir jarang ada perintah yang pernah mengambil pengaturan opsi pertama, dan mengabaikan argumen yang akan mengubah opsi yang sudah ditetapkan.
Peter Cordes

7

Ya, untuk rmini valid. Namun, jika opsi terakhir mengabaikan yang sebelumnya tergantung pada masing-masing program itu sendiri. Dari ´info rm´

'-f' '--force' Abaikan file yang tidak ada dan operan yang hilang, dan jangan pernah meminta pengguna. Abaikan opsi '--interactive' ('-i') sebelumnya.

'-i' Prompt apakah akan menghapus setiap file. Jika responsnya tidak afirmatif, file akan dilewati. Abaikan opsi '--force' ('-f') sebelumnya. Setara dengan '--interaktif = selalu'.

Sebagai petunjuk umum: infobiasanya lebih rinci daripada man, yang biasanya lebih rinci daripada --helpopsi.


7

Tidak ada "prioritas" untuk bendera, masing-masing program menanganinya seperti yang diinginkan. Sebagian besar melakukan upaya untuk mengumpulkan semua bendera dan memeriksa konflik, untuk alat standar (seperti yang direferensikan rm(1)) standar yang relevan mungkin mengamanatkan sesuatu (tapi sekali lagi, versi khusus Anda mungkin ceroboh dalam menafsirkan kasus sudut standar / tidak diuji secara khusus untuk mereka).

Untuk programmer yang menulis program, paling mudah untuk mempertimbangkan argumen (flag dan lainnya) dalam urutan ketat dari kiri ke kanan, dan mungkin menyelamatkan ketika memukul beberapa halangan. Jika menggunakan perpustakaan untuk menangani flag (seperti getopt(3), ada beberapa versi yang beredar) programmer mungkin melakukan apa yang paling mudah / alami. Programmer adalah orang, orang malas (atau setidaknya tidak suka memikirkan ledakan kombinatorial).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.