La priorité des options de commande?

21

Je sais que rm -f file1cela supprimera de force file1sans me le demander.

Je sais également que rm -i file1cela m'invitera avant de supprimerfile1

Maintenant, si vous exécutez rm -if file1, cela supprimera également de force file1sans me le demander.

Cependant, si vous exécutez rm -fi file1, cela m'invitera avant de supprimer file1.

Est-il donc vrai que lors de la combinaison des options de commande, la dernière aura priorité? comme rm -if, alors -faura priorité, mais rm -fialors le -isera prioritaire.

La lscommande par exemple, peu importe si vous avez dit ls -latRou ls -Rtal.

Donc, je suppose que cela n'a d'importance que lorsque vous avez des options de commande contradictoires comme rm -if, est-ce correct?

Alcabary
la source
Stéphane Chazelas

Réponses:

23

Lors de l'utilisation rmavec les deux options -iet -f, la première sera ignorée. Ceci est documenté dans la norme POSIX :

    -f
       Do not prompt for confirmation. Do not write diagnostic messages or modify
       the exit status in the case of nonexistent operands. Any previous
       occurrences of the -i option shall be ignored.
    -i
       Prompt for confirmation as described previously. Any previous occurrences
       of the -f option shall be ignored.

et aussi dans la infopage GNU :

‘-f’
‘--force’

    Ignore nonexistent files and missing operands, and never prompt the user.
    Ignore any previous --interactive (-i) option.

‘-i’
    Prompt whether to remove each file. If the response is not affirmative, the
    file is skipped. Ignore any previous --force (-f) option.

Voyons ce qui se passe sous le capot:

rmtraite son option avec getopt(3), spécifiquement getopt_long. Cette fonction traitera les arguments d'option dans la ligne de commande ( **argv) par ordre d'apparition:

Si getopt () est appelée à plusieurs reprises, elle renvoie successivement chacun des caractères d'option de chacun des éléments d'option.

Cette fonction est généralement appelée en boucle jusqu'à ce que toutes les options soient traitées. Dans cette perspective de fonctions, les options sont traitées dans l'ordre. Ce qui se passe en réalité, cependant, dépend de l'application, car la logique d'application peut choisir de détecter les options en conflit, de les remplacer ou de présenter une erreur. Pour le cas de rmet les options iet f, ils se superposent parfaitement. De rm.c:

234         case 'f':
235           x.interactive = RMI_NEVER;
236           x.ignore_missing_files = true;
237           prompt_once = false;
238           break;
239 
240         case 'i':
241           x.interactive = RMI_ALWAYS;
242           x.ignore_missing_files = false;
243           prompt_once = false;
244           break;

Les deux options définissent les mêmes variables, et l'état de ces variables sera la dernière option dans la ligne de commande. L'effet est conforme au standard POSIX et à la rmdocumentation.

casey
la source
3
La plupart des commandes traitent leurs arguments dans l'ordre, et soit une erreur sur les conflits ou prennent le dernier paramètre (comme rm). Je pense qu'il est rare qu'une commande prenne jamais le premier paramètre d'une option et ignore les arguments qui changeraient une option déjà définie.
Peter Cordes
7

Oui, car rmc'est valable. Si la dernière option remplace les précédentes, cela dépend du programme individuel lui-même. De «info rm»

'-f' '--force' Ignore les fichiers inexistants et les opérandes manquants, et n'invite jamais l'utilisateur. Ignorez toute option précédente '--interactive' ('-i').

'-i' Indique s'il faut supprimer chaque fichier. Si la réponse n'est pas affirmative, le fichier est ignoré. Ignorez toute option précédente '--force' ('-f'). Équivalent à «--interactive = toujours».

À titre d'indication infogénérale : est généralement plus détaillé que man, qui lui-même est généralement plus détaillé que l' --helpoption.

Fiximan
la source
7

Il n'y a pas de "priorité" pour les drapeaux, chaque programme les gère comme il le souhaite. La plupart font un effort pour collecter tous les drapeaux et vérifier les conflits, pour les outils standard (comme ceux référencés rm(1)), les normes pertinentes peuvent exiger quelque chose (mais là encore, votre version particulière peut être bâclée dans l'interprétation des cas d'angle de la norme / ne pas être spécifiquement testée pour eux).

Pour le programmeur qui écrit le programme, il est plus facile de considérer les arguments (drapeaux et autres) dans un ordre strict de gauche à droite, et peut-être de renflouer en frappant un accroc. Si vous utilisez une bibliothèque pour gérer les indicateurs (comme getopt(3), il existe plusieurs versions flottantes), le programmeur fait probablement ce qui est le plus facile / naturel. Les programmeurs sont des gens, les gens sont paresseux (ou du moins n'aiment pas penser à l'explosion combinatoire).

vonbrand
la source