Dado que zsh
pode destruir todos os arquivos com o comando:
>*
Estou pensando que definir a opção noclobber
seria uma boa ideia.
Eu sempre posso usar >| file
se quiser usar o comportamento clobber padrão no bash e no zsh. (zsh também permite a sintaxe alternativa >!file
).
Acho que noclobber
não está definido por padrão devido à compatibilidade com POSIX, mas só para ter certeza:
Existem desvantagens na configuração noclobber
?
Existe alguma maneira de definir noclobber
apenas para o shell interativo?
O motivo
noclobber
não é definido por padrão é a tradição. Por uma questão de design de interface do usuário, é uma boa idéia fazer “criar este novo arquivo” a ação mais fácil e colocar um obstáculo extra na ação mais perigosa “criar um novo arquivo ou substituir um arquivo existente”. Portantonoclobber
, é uma boa ideia (>
criar um novo arquivo,>|
potencialmente sobrescrever um arquivo existente) e provavelmente teria sido o padrão se o shell tivesse sido projetado algumas décadas depois.Eu recomendo usar o seguinte em seu arquivo de inicialização do shell interativo (
.bashrc
ou.zshrc
):Em cada caso (redirecionamento, cópia, movimentação), o objetivo é adicionar um obstáculo extra quando a operação pode ter o efeito colateral de apagar alguns dados existentes, mesmo que apagar dados existentes não seja o objetivo principal da operação. Não coloco
rm -i
nesta lista porque apagar dados é o objetivo principal dorm
.Observe isso
noclobber
e-i
são redes de segurança . Se eles acionarem, você fez algo errado . Portanto, não os use como desculpa para não verificar o que você está substituindo! O ponto é que você deveria ter verificado que o arquivo de saída não existe. Se lhe disseremfile exists: foo
ouoverwrite 'foo'?
, significa que você cometeu um erro e deve se sentir mal e ser mais cuidadoso. Em particular, não adquira o hábito de dizery
se solicitado a substituir (sem dúvida, os aliases devem seralias cp='yes n | cp -i' mv='yes n | mv -i'
, mas pressionar Ctrl+ Cfaz com que a saída pareça melhor): se você pretendia substituir, cancelar o comando, mover ou remover a saída arquivo e execute o comando novamente.Também é importante não ter o hábito de acionar essas seguranças porque se você fizer isso, um dia você estará em uma máquina que não tem a sua configuração e perderá dados porque as proteções com as quais você estava contando não são t lá.
noclobber
só será definido para shells interativos, pois.bashrc
ou.zshrc
é lido apenas por shells interativos. É claro que você não deve alterar as opções do shell de uma maneira que afete os scripts, pois isso pode quebrar esses scripts.A desvantagem é que, se você se acostumar a ter
noclobber
ativo, um dia usará um sistema em que ele não está ativo e executará alegremente um comando potencialmente perigoso, esperandonoclobber
que o salve... e não o fará. E então você terá que esperar que haja um backup recente o suficiente para recuperar os dados que você destruiu porque você assumiu que seria solicitado a confirmação primeiro.Definir a
noclobber
opção de shell em~/.bashrc
(forbash
) ou~/.zshrc
(ou mais precisamente$ZDOTDIR/.zshrc
, forzsh
) a tornará ativa em sessões de shell interativas.Shells não interativos (scripts) não leem esses arquivos.
As opções de shell normalmente não são herdadas de shells pai.
Isso significa que você deve poder definir a opção nesses arquivos sem modificar o comportamento nos scripts existentes, a menos que os scripts forneçam explicitamente esses arquivos.
A única desvantagem de fazer isso que posso ver é que você esquecerá repetidamente que definiu a opção, pelo menos no início. Mais tarde, como acontece com todo esse tipo de coisas, você começará a usar
>|
, mesmo nos casos em que você realmente não queira sobrecarregar o arquivo (assim como as pessoas com aliases pararm
,cp
emv
com a-i
opção sempre definida, eventualmente comece a usar sempre-f
na linha de comando).Eu recomendo adicionar um alias para o
rm
comando também.Estou combinando a resposta aceita e minha sugestão para simplificar.