O manual do GNU Coreutils paramv
diz:
-f --force Do not prompt the user before removing a destination file.
No entanto, esse já parece ser o comportamento padrão para mv
, portanto, a -f
opção parece ser supérflua. Por exemplo, no GNU Bash versão 4.3.11:
$ ls -l
total 0
$ touch 1 2; mv -f 1 2; ls
2
$ touch 1 2; mv 1 2; ls
2
Parece improvável que a intenção do -f
sinalizador seja substituir alias mv="mv -i"
, porque existem várias maneiras padrão de substituir um apelido (por exemplo, usar \mv
) que faria isso de forma mais concisa e consistente de todos os comandos.
O manual observa que, "Se você especificar mais de uma das opções -i, -f, -n, somente a final entrará em vigor", mas ainda parece improvável que a intenção da -f
bandeira seja substituí-la -i
em geral, porque um comportamento equivalente pode ser alcançado simplesmente usando mv
, o que é muito mais conciso e compreensível do que usar mv -if
.
Sendo esse o caso, qual é o objetivo da -f
bandeira? Por que isso existe?
mount
, por exemplo (embora haja exemplos melhores). Deseja realmente lembrar quais são os padrões de todas as opções, para poder determinar quais opções precisam ser definidas? É uma BOA COISA ter opções tanto para o padrão quanto para o não padrão, para que você possa definir explicitamente a opção em vez de precisar acompanhar mentalmente qual é o padrão. Algo que é mais fácil de lembrar do que algo que não existe .Respostas:
O uso de
-f
é descrito com mais clareza na página de manual do 4BSD, onde foram adicionadas as opções-f
e-i
:Uma definição ainda mais precisa de como o mv opera é fornecida no padrão POSIX , que acrescenta que
-f
somente substitui-i
se ocorrer posteriormente na linha de comando.Portanto, o comportamento padrão é um pouco diferente de
-f
. O padrão é solicitar confirmação apenas quando o destino não for gravável. (Esse comportamento remonta pelo menos até a V4 , ondemv
não havia opções.) Se a-i
opção for dada, o mv solicitará adicionalmente a confirmação sempre que o destino existir. A-f
opção inibirá a pergunta em ambos os casos (se ocorrer depois de algum-i
).fonte
-f
sinalizador tivesse sido usado, mesmo que não tivesse sido usado .isatty(0)
). Além disso, embora seja verdade que uma-f
substituição posterior-i
, pode não significar que isso é o mesmo que nenhum argumento fornecido.É útil ao definir a execução de
mv
um padrão sadio:Quando você quiser forçar uma mudança, isso funcionará:
Como é a última opção no comando expandido que conta:
Este ponto também é mencionado no manual GNU Coreutils .
fonte
alias mv="mv -i"
seja a razão da existência de-f
.mv(1)
(e outros comandos Unix) "louco" como você implica ...-i
, acredito que qualquer pessoa que tenha usado a linha de comando por mais de alguns anos tenha sido queimada pormv
, em um ponto ou outro.Existe porque (
man mv
)Portanto, você pode ter um script / alias / função que sempre pergunta, mas ainda pode substituir a opção.
Uma função / script significativo faria algo mais, é claro (por exemplo, registre a ação).
fonte
alias mv="mv -i"
o motivo da existência de-f
. Você menciona scripts e funções também. Por favor, você poderia dar exemplos usando esses dois?mv -f
, portanto ainda não está claro para mim como eles justificam / explicam sua existência. Desculpe se estou perdendo o óbvio!mv -i
. Se você quiser usá-los, mas pular a interação, você usariaMV -f
etc. #mv
sem nenhuma dessas opções é às vezes perguntar (destino, terminal não gravável e interativo); portanto, essa seria uma clara diferença entremv -f
e\mv
.O
mv
comando por si só pode funcionar de maneira diferente com a-f
opção, na medida em que tentará sobrescrever arquivos protegidos contra gravação sem aviso.Por causa das permissões de gravação no diretório, o usuário2 pode substituir os arquivos do usuário1
./dir/
, mas será avisado antes de fazê-lo.-f
impede o aviso.fonte
Na programação de shell, o uso de -f é um idioma comum usado para garantir que seus comandos não abortem com erros ou peça ao script / usuário uma resposta interativa ao executar determinados comandos. A última coisa que você deseja é que seu script pause aguardando a entrada do usuário, ou talvez pior, que o comando errado leve a entrada do padrão.
Nota: desfazer um alias pode causar / remover efeitos colaterais. Se você aliasou o comando para outra versão ou com opções adicionais, desfazer o alias causará efeitos colaterais indesejados. Por exemplo, você pode ter um alias configurado com mv e rm para usar uma lata de reciclagem (ou outros sistemas de proteção / rastreamento). Desfazer o alias quebrará isso ...
fonte
-f
opção para cp ou mv não garante que "eles funcionem". Por exemplo, se a permissão for insuficiente, o comando -f não fará com que funcione. O que você quis dizer com isso é que -f força uma substituição sem aviso prévio. O sinalizador oposto -i significa exigir interativo na substituição.isatty(0)
), por exemplo, se seu script for executado como parte de um canal, ele não será acionado. 2.) Adicionar-f
não é o mesmo que desfazer,-i
porquemv -i -f
difere demv
, veja a resposta de Marcos .