Dado que zsh
pode derrotar todos os arquivos, dado o comando:
>*
Eu estou pensando que definir a opção noclobber
seria uma boa idéia.
Eu sempre posso usar >| file
se eu quiser usar o comportamento padrão do clobber no bash e no zsh. (zsh também permite a sintaxe alternativa >!file
).
Acho que noclobber
não está definido por padrão por causa da compatibilidade com POSIX, mas apenas para ter certeza:
Existem desvantagens na configuração noclobber
?
Existe uma maneira de definir noclobber
apenas para o shell interativo?
rm *
...Respostas:
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
):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 principalrm
.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 informadofile exists: foo
ouoverwrite 'foo'?
, significa que cometeu um erro e deve se sentir mal e ter mais cuidado. Em particular, não adquira o hábito de dizery
se for 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ê 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.fonte
rm
tem uma opção-I
que eu uso e recomendo: "avise uma vez antes de remover mais de três arquivos ou remova recursivamente; menos invasivo que-i
, ao mesmo tempo em que protege contra a maioria dos erros"-i
como argumento padrão para eles é uma excelente idéia, mas deve ser aplicada em diferentes nomes alternativos , não nos originais (por exemplo, eu sempre colocoalias copy="cp -i"
ealias move="mv -i"
no meu .bashrc). Por quê? Por causa do modo de falha. O que acontece quando você usa uma máquina ou um usuário diferente que não possui os aliases cp / mv? Arquivos potencialmente substituídos sem intenção (possivelmente não detectados!). Modo de falha correspondente com alias de copiar / mover: o shell reclama que não reconhece o comando.-i
argumento para cp e mv é excelente, mas o conselho para reutilizar os nomes cp e mv é horrivelmente ruim. É tão ruim que tenho que dar uma resposta negativa à resposta. Altere para usar diferentes nomes alternativos e eu votarei em votação positiva.alias RM='command rm'
, o que diria ao zsh para usar o comando externo emrm
vez do alias. Dessa forma, você não precisa confiar em--interactive=never
substituir uma anterior-i
.Definir a
noclobber
opção do shell em~/.bashrc
(parabash
) ou~/.zshrc
(ou mais precisamente$ZDOTDIR/.zshrc
, parazsh
) o tornará ativo em sessões de shell interativas.Os shells (scripts) não interativos não leem esses arquivos.
As opções de shell normalmente não são herdadas dos 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 os originem explicitamente.
A única desvantagem de fazer isso que posso ver é que você esquecerá repetidamente que definiu a opção, pelo menos no começo. Posteriormente, como em todo esse tipo de coisa, você começará a usar habitualmente
>|
, mesmo nos casos em que talvez não queira obstruir o arquivo (assim como as pessoas com pseudônimos pararm
,cp
emv
com a-i
opção sempre definida, eventualmente começará a usar sempre-f
na linha de comando).fonte
bash
, as opções são herdadas se$SHELLOPTS
($BASHOPTS
parashopt
as) estiver no ambiente (algo que você geralmente não gostaria de fazer por esse motivo).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 você o salve ... e isso não acontecerá. E então você terá que esperar que haja um backup recente o suficiente para recuperar os dados que você destruiu, porque você supôs que seria solicitada a confirmação primeiro.fonte