Mengingat bahwa zsh
dapat mengalahkan semua file yang diberikan perintah:
>*
Saya berpikir bahwa menetapkan opsi noclobber
akan menjadi ide yang bagus.
Saya selalu dapat menggunakan >| file
jika saya ingin menggunakan perilaku clobber default di bash dan zsh. (zsh juga memungkinkan sintaks alternatif >!file
).
Saya menduga noclobber
tidak disetel secara default karena kompatibilitas POSIX, tetapi hanya untuk memastikan:
Apakah ada kelemahan pada pengaturan noclobber
?
Apakah ada untuk mengatur noclobber
hanya untuk shell interaktif?
rm *
...Jawaban:
Alasannya
noclobber
tidak diatur secara default adalah tradisi. Sebagai masalah desain antarmuka pengguna, merupakan ide yang baik untuk membuat "buat file baru ini" tindakan yang mudah dan untuk menempatkan rintangan ekstra tindakan yang lebih berbahaya "baik membuat file baru atau menimpa file yang sudah ada". Maka itunoclobber
adalah ide yang baik (>
untuk membuat file baru,>|
untuk berpotensi menimpa file yang sudah ada) dan kemungkinan akan menjadi default jika shell telah dirancang beberapa dekade kemudian.Saya sangat menyarankan untuk menggunakan yang berikut ini di file startup shell interaktif Anda (
.bashrc
atau.zshrc
):Dalam setiap kasus (pengalihan, penyalinan, pemindahan), tujuannya adalah untuk menambahkan rintangan tambahan ketika operasi mungkin memiliki efek samping menghapus beberapa data yang ada, meskipun menghapus data yang ada bukanlah tujuan utama operasi. Saya tidak memasukkan
rm -i
daftar ini karena menghapus data adalah tujuan utamarm
.Perhatikan itu
noclobber
dan-i
merupakan jaring pengaman . Jika mereka memicu, Anda telah melakukan kesalahan . Jadi jangan gunakan itu sebagai alasan untuk tidak memeriksa apa yang Anda timpa! Intinya adalah Anda harus memeriksa bahwa file output tidak ada. Jika Anda diberitahufile exists: foo
atauoverwrite 'foo'?
, itu berarti Anda melakukan kesalahan dan Anda harus merasa buruk dan lebih berhati-hati. Secara khusus, jangan terbiasa mengatakany
jika diminta untuk menimpa (bisa dibilang, alias seharusnyaalias cp='yes n | cp -i' mv='yes n | mv -i'
, tetapi menekan Ctrl+ Cmembuat output terlihat lebih baik): jika Anda bermaksud menimpa, membatalkan perintah, memindahkan atau menghapus output file, dan jalankan perintah lagi.Penting juga untuk tidak membiasakan diri memicu keselamatan tersebut karena jika Anda melakukannya, suatu hari Anda akan berada di mesin yang tidak memiliki konfigurasi Anda, dan Anda akan kehilangan data karena perlindungan yang Anda hitung pada saat itu tidak di sana.
noclobber
hanya akan ditetapkan untuk shell interaktif, karena.bashrc
atau.zshrc
hanya dibaca oleh shell interaktif. Tentu saja Anda tidak boleh mengubah opsi shell dengan cara yang akan memengaruhi skrip, karena skrip tersebut dapat merusak skrip tersebut.sumber
rm
memiliki opsi-I
yang saya gunakan dan rekomendasikan: "meminta sekali sebelum menghapus lebih dari tiga file, atau ketika menghapus secara rekursif; tidak terlalu mengganggu daripada-i
, sambil tetap memberikan perlindungan terhadap sebagian besar kesalahan"-i
sebagai argumen default untuk mereka adalah ide yang bagus, tetapi harus diterapkan pada nama alias yang berbeda , bukan yang asli (misalnya saya selalu meletakkanalias copy="cp -i"
danalias move="mv -i"
di .bashrc saya). Mengapa? Karena mode kegagalan. Apa yang terjadi ketika Anda menggunakan mesin atau pengguna lain yang tidak memiliki alias cp / mv? File berpotensi ditimpa secara tidak sengaja (mungkin tidak terdeteksi!). Mode kegagalan yang sesuai dengan copy / move alias: shell mengeluh bahwa ia tidak mengenali perintah.-i
argumen untuk cp dan mv sangat bagus, tetapi saran untuk menggunakan kembali nama cp dan mv sangat buruk. Sangat buruk saya harus memberikan jawaban suara turun. Harap ubah untuk menggunakan nama alias yang berbeda dan saya akan memberikan suara.alias RM='command rm'
, yang akan memberitahu zsh untuk menggunakan perintah eksternal,rm
bukan alias. Dengan begitu Anda tidak harus bergantung pada--interactive=never
menggantikan yang sebelumnya-i
.Mengatur
noclobber
opsi shell di~/.bashrc
(untukbash
) atau~/.zshrc
(atau lebih tepatnya$ZDOTDIR/.zshrc
, untukzsh
) akan membuatnya aktif dalam sesi shell interaktif.Kerang (skrip) non-interaktif tidak membaca file-file ini.
Opsi shell biasanya tidak diwarisi dari shell induk.
Ini berarti bahwa Anda harus dapat mengatur opsi di file-file itu tanpa mengubah perilaku di skrip yang ada, kecuali skrip secara eksplisit sumber file-file tersebut.
Satu-satunya downside dari melakukan ini yang dapat saya lihat adalah bahwa Anda akan berulang kali lupa bahwa Anda telah menetapkan opsi, setidaknya di awal. Kemudian, seperti semua hal-hal semacam ini, Anda akan mulai terbiasa menggunakan
>|
, bahkan dalam kasus-kasus di mana Anda sebenarnya tidak ingin merusak file (seperti halnya orang dengan aliasrm
,cp
danmv
dengan-i
opsi selalu diset, akhirnya mulai selalu menggunakan-f
di baris perintah).sumber
bash
, opsi diwarisi jika$SHELLOPTS
($BASHOPTS
untukshopt
yang) ada di lingkungan (bukan sesuatu yang umumnya ingin Anda lakukan karena alasan semacam ini).Kelemahannya adalah, jika Anda menjadi terbiasa dengan
noclobber
aktif, suatu hari Anda akan menggunakan sistem yang tidak aktif dan Anda akan dengan senang hati menjalankan perintah yang berpotensi berbahaya, mengharapkannoclobber
untuk menyelamatkan Anda ... dan tidak akan. Dan kemudian Anda harus berharap bahwa ada cadangan yang cukup baru untuk memulihkan data yang Anda hancurkan karena Anda menganggap Anda akan diminta konfirmasi terlebih dahulu.sumber