Par exemple:
xargs -n 1
est le même que
xargs -n1
Mais si vous regardez la page de manuel , l'option est répertoriée comme -n max-args
, ce qui signifie que l'espace est censé être préservé. Il n'y a rien sur la forme abrégée -n max-args .
Cela se produit également avec de nombreux autres utilitaires Linux.
Comment cela s'appelle-t-il sous Linux? Tous les utilitaires prennent-ils en charge le formulaire abrégé (mais ne le documentent jamais dans la page de manuel)?
Réponses:
Lorsque vous écrivez le bit d'analyse de ligne de commande de votre code, vous spécifiez quelles options acceptent les arguments et lesquelles ne le font pas. Par exemple, dans un script shell acceptant une
-h
option (pour l'aide par exemple) et une-a
option qui devrait prendre un argument, vous faitesLe
a:h
bit dit "je m'attends à analyser deux options,-a
et-h
, et-a
devrait prendre un argument" (c'est la:
suitea
qui indique à l'analyseur qui-a
prend un argument).Par conséquent, il n'y a jamais d'ambiguïté quant à la fin d'une option, au début de sa valeur et au début d'une autre après.
L'exécuter:
C'est pourquoi la plupart du temps, vous ne devez pas écrire votre propre analyseur de ligne de commande pour analyser les options.
Il n'y a qu'un seul cas dans cet exemple qui est délicat. L'analyse se termine généralement à la première non-option, donc lorsque vous avez des éléments sur la ligne de commande qui ressemblent à des options:
Ce qui suit résout cela:
Le
--
signale une fin des options de ligne de commande, et le-world
bit est laissé au programme pour faire ce qu'il veut (c'est dans l'une des variables de position).C'est d'ailleurs la façon dont vous supprimez un fichier qui a un tiret au début de son nom de fichier avec
rm
.MODIFIER :
Les utilitaires écrits en appel C
getopt()
(déclarés enunistd.h
) fonctionnent de la même manière. En fait, pour autant que nous sachions, labash
fonctiongetopts
peut être mis en œuvre au moyen d' un appel à la fonction de bibliothèque Cgetopt()
. Perl, Python et d'autres langages ont des bibliothèques d'analyse de ligne de commande similaires, et il est très probable qu'ils effectuent leur analyse de manière similaire.Certaines de ces routines de bibliothèque
getopt
etgetopt
similaires gèrent également les options "longues". Celles-ci sont généralement précédées de double tiret (--
), et les options longues qui prennent des arguments le font souvent après un signe égal, par exemple l'--block-size=SIZE
option de [certaines implémentations de] l'du
utilitaire (qui permet également-B SIZE
de spécifier la même chose).La raison pour laquelle les manuels sont souvent écrits pour montrer un espace entre les options courtes et leurs arguments est probablement pour la lisibilité.
EDIT : les outils vraiment anciens, tels que les utilitaires
dd
ettar
, ont des options sans tirets devant eux. Ceci est purement pour des raisons historiques et pour maintenir la compatibilité avec les logiciels qui dépendent d'eux pour fonctionner exactement de cette façon. L'tar
utilitaire a acquis la possibilité de prendre des options avec des tirets plus récemment. Le manuel BSD pour lestar
appels les anciennes options de "drapeaux groupés".la source
getopt()
(déclaré enunistd.h
), ce qui fait la même chose.-a -b
===-ab
-a
a un argument facultatif,-ab
n'est pas le même que-a -b
). GNU getopt n'arrête pas le traitement des drapeaux lors de la rencontre d'un non-drapeau: à la place (par défaut), il remanie les drapeaux à l'avant d'argv.xargs
est l'un des utilitaires POSIX. Comme l'a commenté @drewbenn, POSIX documente le comportement d'analyse des options pour la plupart de ses utilitaires pour correspondregetopt
, avec quelques allocations pour d'autres implémentations, en disant dans 12.1 Syntaxe de l'argument utilitaire :et concluant avec
Dans POSIX (rappelez-vous qu'il ne couvre que les utilitaires les plus couramment utilisés), il existe des exceptions qui transmettent des opérandes qui seraient des options dans d'autres utilitaires en tant que paramètres positionnels ou paramètres avec une syntaxe spéciale :
POSIX permet des valeurs d'option facultatives :
Offhand, je ne me souviens pas quels utilitaires POSIX utilisent la fonction. Les ncurses
tic
et lesinfocmp
utilitaires utilisent la fonction pour les niveaux de l'-v
option (verbose / debug).Le point précis que vous avez demandé est détaillé dans la suite de ce paragraphe, sur plusieurs lignes.
Avant POSIX, certaines implémentations d'
ps
options acceptées sans trait d'union. La description POSIX ne mentionne pas cela dans la description de l'utilitaire ou dans la logique de la syntaxe:Mis à part POSIX, il existe des implémentations à options longues (telles que GNU getopt_long ou X Toolkit ), utilisant une variété de façons de séparer ou de joindre la valeur d'une option à l'option. Par exemple, la ponctuation peut être utilisée:
Selon l'implémentation, un double tiret peut / ne peut pas être utilisé pour distinguer les options longues des options courtes (getopt): lynx et X Toolkit utilisent un seul tiret; GNU
getopt_long
utilise un double tiret, par exemple. De plus, un+
peut être utilisé pour indiquer qu'une option est annulée.La description de POSIX ne semble en mentionner aucun, mais vous êtes certainement susceptible de les rencontrer.
la source
-option=value
censé l'être--option=value
? (Le format à option longue, deux tirets au début au lieu d'un)