Eu sei que isso rm -f file1
será removido com força file1
sem me avisar.
Eu também sei que isso rm -i file1
irá me avisar antes de removerfile1
Agora, se você executar rm -if file1
, isso também será removido com força file1
sem avisar.
No entanto, se você executar rm -fi file1
, ele será solicitado antes da remoção file1
.
Então, é verdade que, ao combinar as opções de comando, a última terá precedência? como rm -if
, então -f
terá precedência, mas rm -fi
então -i
terá precedência.
O ls
comando, por exemplo, não importa se você disse ls -latR
ou ls -Rtal
.
Então, acho que só importa quando você tem opções de comando contraditórias como rm -if
, está correto?
command-line
rm
command
options
alcabar
fonte
fonte
Respostas:
Ao usar
rm
com ambos-i
e-f
opções, o primeiro será ignorado. Isso está documentado no padrão POSIX :e também na
info
página GNU :Vamos ver o que acontece sob o capô:
rm
processa sua opção comgetopt(3)
, especificamentegetopt_long
. Esta função processará os argumentos das opções na linha de comando (**argv
) na ordem em que aparecer:Essa função é normalmente chamada em loop até que todas as opções sejam processadas. Nesta perspectiva de funções, as opções são processadas em ordem. O que realmente acontece, no entanto, depende do aplicativo, pois a lógica do aplicativo pode optar por detectar opções conflitantes, substituí-las ou apresentar um erro. Para o caso de
rm
e as opçõesi
ef
, eles substituem perfeitamente um ao outro. Derm.c
:As duas opções definem as mesmas variáveis e o estado dessas variáveis será a opção que for a última na linha de comando. O efeito disso está alinhado com o padrão POSIX e a
rm
documentação.fonte
rm
). Eu acho que é raro um comando pegar a primeira configuração de uma opção e ignorar argumentos que alterariam uma opção já definida.Sim, pois
rm
isso é válido. Se a última opção substitui as anteriores, no entanto, depende do programa individual. De "info rm"Como uma dica geral:
info
geralmente é mais detalhado queman
, o que em si é geralmente mais detalhado que a--help
opção.fonte
Não há "precedência" para sinalizadores, cada programa lida com eles da maneira que desejar. A maioria faz algum esforço para coletar todos os sinalizadores e verificar se há conflitos; para ferramentas padrão (como as mencionadas
rm(1)
), os padrões relevantes podem exigir algo (mas, novamente, sua versão específica pode ser desleixada na interpretação de casos de canto do padrão / não é testada especificamente para eles).Para o programador que está escrevendo o programa, é mais fácil considerar os argumentos (sinalizadores e outros) em estrita ordem da esquerda para a direita, e talvez socorrer ao acertar algum obstáculo. Se estiver usando uma biblioteca para manipular sinalizadores (como
getopt(3)
, existem várias versões flutuando), o programador presumivelmente faz o que é mais fácil / natural. Programadores são pessoas, pessoas são preguiçosas (ou pelo menos não gostam de pensar na explosão combinatória).fonte