Objetivo
Sempre que eu uso mv
(ou comandos de natureza similar) eu quero que meu shell me indique algo como " Ei, você usou mv. Desculpe, mas faça de novo usando mv -i ". Eu gostaria de saber o método razoável para realizar tal interação.
O objetivo é fazer com que meu computador reclame sempre que eu usar mv
, então devo inserir novamente mv -i
. Desta forma vou desenvolver a memória muscular para entrar mv -i
.
Fazer com que meu computador converta meu mv
para mv -i
sob o capô não é o objetivo e anula completamente a intenção.
Se isso soa como uma ideia estúpida em primeiro lugar, gostaria de saber por que e melhores soluções.
Fundo
No passado, usei mv
e sobrescrevi arquivos por engano. Embora este comentário recomende o alias mv
de uma maneira que realmente funcionemv -i
, concordo com este comentário sobre as consequências de tal personalização . Em vez de me acostumar a digitar mv
, prefiro criar o hábito de digitar mv -i
para não atrapalhar outras máquinas.
Preocupações
Estou preocupado com essas modificações que afetam outros scripts ou programas que invocam mv
. Existe uma maneira inteligente de abortar e mostrar o prompt apenas quando mv
executado por mim digitando e pressionando Enter?
Notas
- Eu faço backup de arquivos, não que seja relevante
- Eu sei que posso colar post-its na minha mesa ou pôsteres na minha parede para aumentar a conscientização
- Ambiente: Debian, XFCE, xfce4-terminal, Bash
Eu usaria uma função wrapper: você pode adicionar isso ao seu .bashrc (não testado)
A maneira mais fácil é criar um alias.
Mais complicado, mas mais personalizável, seria criar um
mv
script de shell, colocá-lo no/bin
, e omv
movimento real para/sbin
ou qualquer outro diretório 'secreto'. O script de substituição fará avisos e chamará o originalmv
pelo caminho completo.Se você quiser se salvar completamente
mv
- renomeie ou exclua a ferramenta.Sim, outros scripts podem falhar devido a tais modificações. Nesse caso, você pode entrar nesses scripts e corrigi-los, substituindo
mv
por um/secret/path/mv
Outra maneira - crie um usuário especial para a vida cotidiana. Crie para ele (geralmente em
$HOME/bin
) uma cópia do real/bin
com exclusão de ferramentas perigosas. Defina um PATH para esse usuário diário que usará/home/everyday/bin
em vez de/bin
.Se algum aplicativo agora exigir ferramentas "perigosas" - esse aplicativo não é para o usuário "cotidiano" - mude para um usuário com mais privilégios.
Embora a abordagem de @glennJackman com um wrapper que verifica se os primeiros argumentos começam com
-
e contémi
seja boa o suficiente na maioria dos casos comuns, há alguns casos em que ela falha:mv --help
(não--version
que contém-i
).-i
inmv -v -i a b
(ou omv a b -i
que o GNUmv
permite quando não há nenhumPOSIXLY_CORRECT
no ambiente).mv --interactive
// ...mv --in
mv --i
-i
emmv --no-target-dir a b
oumv -Tdir file
...Para um wrapper cobrir todos esses casos, precisaríamos que ele analisasse suas opções da mesma maneira
mv
. Não são duas implementações que analisam suas opções da mesma maneira. Você encontrará até diferenças entre as versões das mesmasmv
implementações.A implementação do GNU
mv
(e a maioria dos utilitários) usarágetopt_long()
para analisar suas opções.Se seu wrapper pudesse chamar
getopt_long()
com os mesmos argumentos, seríamos classificados. O que deixa dois problemas:getopt_long()
o shellmv
passam paragetopt_long()
Se você estiver em um sistema GNU/Linux, existem maneiras possíveis.
Embora não haja shell CLI
getopt_long()
na caixa de ferramentas GNU, há uma emutil-linux
: seugetopt
utilitário quando usado com-o
e-l
.No GNU/Linux, os utilitários GNU invocarão a
getopt_long()
função da libc como será a GNU libc, então você pode usarltrace
quais chamadas de biblioteca de rastreamentos para ver qualgetopt_long()
chamadamv
faz para analisar opções.(onde
-:
é garantido ser uma opção falsa)Não é bom o suficiente, pois vemos apenas as opções curtas. No entanto, é possível configurar
ltrace
para decodificar olong_options
argumento e até ocultar os parâmetros que não nos importam.Como prova de conceito, aqui está um script zsh que produziria o
sh
código compatível para uma função wrapper que verifica se o-i
/--interactive
(ou--help
/--version
) ou suas abreviações antes de chamarmv
:Por exemplo, no meu sistema, as
that-script mv rm
saídas:Você faria:
Na configuração do modo interativo do seu shell (
~/.zshrc
,~/.bashrc
...).Para definir esses wrapper. E depois: