O motivo noclobber
não é definido por padrão é tradição. Por uma questão de design da interface do usuário, é uma boa idéia tornar "criar este novo arquivo" a ação fácil e colocar um obstáculo extra na ação mais perigosa "criar um novo arquivo ou substituir um arquivo existente". Portanto, noclobber
é uma boa idéia ( >
criar um novo arquivo, >|
potencialmente substituir 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 no arquivo de inicialização do shell interativo ( .bashrc
ou .zshrc
):
set -o noclobber
alias cp='cp -i'
alias mv='mv -i'
Em cada caso (redirecionamento, cópia, movimentação), o objetivo é adicionar um obstáculo extra quando a operação tiver o efeito colateral de apagar alguns dados existentes, mesmo que a exclusão de dados existentes não seja o objetivo principal da operação. Eu não coloquei rm -i
nesta lista porque apagar os dados é o objetivo principal rm
.
Observe noclobber
e -i
são redes de segurança . Se eles dispararem, você fez algo errado . Portanto, não use-os como desculpa para não verificar o que você está substituindo! O ponto é que você deveria ter verificado se o arquivo de saída não existe. Se você for informado file exists: foo
ou overwrite 'foo'?
, significa que cometeu um erro e deve se sentir mal e ter mais cuidado. Em particular, não adquira o hábito de dizer y
se for solicitado a substituir (sem dúvida, os aliases devem ser alias cp='yes n | cp -i' mv='yes n | mv -i'
, mas pressionar Ctrl+ Cfaz com que a saída pareça melhor): se você quis substituir, cancele o comando, mova ou remova a saída arquivo e execute o comando novamente.
Também é importante não adquirir o hábito de acionar essas seguranças, porque se o fizer, um dia você estará em uma máquina que não possui sua configuração e perderá dados porque as proteções que contava não são ' t lá.
noclobber
será definido apenas 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 maneira a afetar os scripts, pois isso pode ser interrompido.
rm *
...