`` Noclobber '' kurmanın herhangi bir dezavantajı var mı?


20

Verilen zshkomut verilen tüm dosyaları tıkayabilir:

>*

Seçeneği belirlemenin noclobberiyi bir fikir olacağını düşünüyorum.

>| fileHem bash hem de zsh'de varsayılan clobber davranışını kullanmak istersem her zaman kullanabilirim . (zsh ayrıca alternatif sözdizimine de izin verir >!file).

noclobberPOSIX uyumluluğu nedeniyle varsayılan olarak ayarlanmamış olduğunu tahmin ediyorum , ancak sadece emin olmak için:

Ayarlamanın herhangi bir olumsuz yanı var noclobbermı?

noclobberSadece etkileşimli kabuk için ayarlanacak bir şey var mı ?


3
Ben şaşırdım zsh en azından bu konuda rm *
uyarmaz

Yanıtlar:


24

Sebebi noclobbervarsayılan olarak belirlenmemiştir gelenek. Kullanıcı arayüzü tasarımı ile ilgili olarak, “bu yeni dosyayı yarat” kolay eylemi yapmak ve “ya yeni bir dosya oluşturmak ya da mevcut bir dosyanın üzerine yazmak” için daha tehlikeli bir eylem yapmak daha iyi bir fikirdir. Bu nedenle noclobber( >yeni bir dosya oluşturmak, >|mevcut bir dosyanın üzerine yazmak için) iyi bir fikirdir ve kabuğun birkaç on yıl sonra tasarlanması muhtemelen varsayılan olurdu.

Etkileşimli kabuk başlangıç ​​dosyanızda ( .bashrcveya .zshrc) aşağıdakileri kullanmanızı kesinlikle öneririz :

set -o noclobber
alias cp='cp -i'
alias mv='mv -i'

Her durumda (yeniden yönlendirme, kopyalama, taşıma), mevcut verilerin silinmesi işlemin ana hedefi olmasa da, işlemin mevcut bazı verileri silmenin yan etkisi olabileceğinde, amaç fazladan bir engel eklemektir. rm -iBu listeye girmiyorum çünkü veri silmek birincil hedef rm.

Notu Bunu yap noclobberve -iolan güvenlik ağları . Eğer tetiklerse, yanlış bir şey yaptınız . Bu yüzden, üzerine ne yazdığınızı kontrol etmemek için bir bahane olarak kullanmayın! Mesele şu ki, çıktı dosyasının mevcut olmadığını kontrol etmiş olmalısınız. Size söylenirse file exists: fooveya overwrite 'foo'?, bu bir hata yaptığınız ve kendinizi kötü hissetmeniz ve daha dikkatli olmanız gerektiği anlamına gelir. Özellikle, yüzerine yazmanız istenirse ( alışkanlık olarak takma adlar olmalı alias cp='yes n | cp -i' mv='yes n | mv -i', ancak Ctrl+ tuşuna basmak Cçıktıyı daha iyi gösterir) söyleme alışkanlığına girmeyin : üzerine yazmak, komutu iptal etmek, çıktıyı taşımak veya kaldırmak dosyasını seçin ve komutu tekrar çalıştırın.

Ayrıca, bu güvenlikleri tetikleme alışkanlığına girmemek de önemlidir, çünkü eğer yaparsanız, bir gün yapılandırmanıza sahip olmayan bir makinede olacaksınız ve veri kaybettiğiniz için güvende değilsiniz. orada.

noclobberçünkü sadece, etkileşimli kabuklarda ayarlanacak .bashrcveya .zshrcsadece etkileşimli kabuklarda okunur. Elbette kabuk seçeneklerini komut dosyalarını etkileyecek şekilde değiştirmemelisiniz, çünkü bu komut dosyalarını bozabilir.


6
rmKullanmak -Ive tavsiye etmek için bir seçenek var: "üçten fazla dosya kaldırmadan önce bir kez istemi veya özyinelemeli kaldırırken; -içoğu hataya karşı koruma sağlarken daha az müdahaleci "
Reid

9
Ben cp ve mv bu şekilde yeniden aliasing değil öneririz . Bununla birlikte, -ionlara varsayılan bir argüman olarak kullanmak mükemmel bir fikirdir, ancak orijinallere değil, farklı takma adlara uygulanmalıdır (örneğin her zaman koyduğum alias copy="cp -i"ve alias move="mv -i".bashrc'de). Neden? Arıza modu nedeniyle. Cp / mv takma adı olmayan bir makine veya farklı bir kullanıcı kullandığınızda ne olur? Yanlışlıkla üzerine yazılması muhtemel dosyalar (muhtemelen saptanamayan!). Kopyala / taşı takma adı ile karşılık gelen hata modu: shell komutu tanımadığından şikayet ediyor.
hlovdal

1
Ayrıca cp / mv diğer adı için ek bir hata modu da vardır: kabuk komut dosyası yazarken cp = "cp -i" diğer adı için kullanılan biri, etkileşimli modda olduğu gibi yanlış bir şekilde beklemesini beklerken bir cp komutu yazabilir. ad farkı. Buna karşılık, her zaman "copy somefile / some / where" yazdığımda, doğrudan cp komutunu değil, diğer adı kullandığımı biliyorum. Ve bir kopyasını bir kabuk dosyasına koymam gerekse bile, diğer adı olmayan kabuk için olduğu gibi başarısız olur.
hlovdal

1
TL; DR -icp ve mv için argümanı kullanmak için varsayılan öneri mükemmel, ancak cp ve mv isimlerini yeniden kullanma önerisi korkunç derecede kötü. Cevaba aşağı oy vermek zorundayım çok kötü. Farklı takma adlar kullanmak için lütfen değiştirin ve oy verin.
hlovdal

1
@TomHale Kullanabilirsiniz alias RM='command rm', bu zsh'ye rmtakma ad yerine harici komutu kullanmasını söyler . Bu şekilde --interactive=neverbir öncekinin yerine geçmek zorunda kalmazsınız -i.
Adaephon

6

Ayar noclobberiçinde kabuk seçeneği ~/.bashrc(için bash) ya da ~/.zshrc(ya da daha doğrusu $ZDOTDIR/.zshrc, için zsh) etkileşimli kabuk oturumlarda aktif hale getirecektir.

Etkileşimli olmayan kabuklar (komut dosyaları) bu dosyaları okumaz.

Kabuk seçenekleri normal olarak üst kabuklardan miras alınmaz.

Bu, komut dosyaları bu dosyaları açıkça kaynaklamadığı sürece, varolan komut dosyalarındaki davranışı değiştirmeden seçeneği bu dosyalarda ayarlayabilmeniz gerektiği anlamına gelir.

Görebildiğim tek dezavantajı, seçeneği en azından başlangıçta ayarladığınızı tekrar tekrar unutacağınızdır. Daha sonra her şeyin bu tür olduğu gibi, alışkanlıkla kullanımına başlayacak >|hatta aslında sadece diğer adlar ile insanlar gibi dosya (clobber istemeyebilirsiniz durumlarda rm, cpve mvile -iseçeneği her zaman set sonunda hep kullanımına başlamak -fkomut satırında).


2
İle basheğer seçenekleri devralınan $SHELLOPTS( $BASHOPTSiçin shoptolanlar) çevre (eğer nedenle bu tür olsa yapmak istiyorum genellikle ediyorum değil bir şey) bulunmaktadır.
Stéphane Chazelas

3

Dezavantajı, eğer noclobberaktif olmaya alışırsanız, bir gün aktif olmadığı bir sistem kullanacaksınız ve sizi noclobberkurtarmak için beklerken potansiyel olarak tehlikeli bir komutla blithely yürüteceksiniz ... ve olmayacak. Ve sonra, imha ettiğiniz verileri kurtarmak için yakın zamanda yeterli bir yedekleme olduğunu ummanız gerekir, çünkü önce onaylamanız isteneceğini varsaydınız.


Elbette, bir gün aktif olmadığı bir sistem kullanacaksınız. Bilmediğiniz bir sistem kullanırken, çıktıyı bir dosyaya yönlendirmek gibi zararlı olabilecek bir şey yapmadan önce özellikle dikkatli olmanız ve yedeklemelerin güncel olduğundan emin olmalısınız.
Gilles 'SO- kötü olmayı bırak
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.