Je passe une variable à un script sur la ligne de commande. Quelle est la limite de caractères d'une commande? par exemple:
$ MyScript reallyreallyreally...reallyreallyreallylongoption
Merci.
linux
command-line-interface
robdog
la source
la source
Réponses:
La limite imposée shell / OS est généralement très longue - généralement un ou deux cent mille caractères.
getconf ARG_MAX
vous donnera la limite d'entrée maximale pour une commande. Sur le système Debian, j'ai actuellement un terminal ouvert sur ce retourne 131072 qui est 128 * 1024. La limite est réduite par vos variables d'environnement comme si ma mémoire me servait correctement celles-ci sont passées dans la même structure par le shell, bien que cela n'enlèvera que quelques centaines de caractères dans la plupart des cas. Pour trouver une approximation de cette valeur exécutéeenv | wc -c
- cela suggère 325 caractères à l'heure actuelle sur cette connexion sur cette machine.Les scripts autoriseront probablement cette longueur totale, mais il n'est pas improbable que d'autres services publics imposent leurs propres limites, intentionnellement ou par le biais de problèmes de conception. Il peut également y avoir des limites artificielles à la durée d'un argument individuel sur une longue ligne de commande et / ou à la longueur d'un chemin d'accès à un fichier.
la source
getconf ARG_MAX
donne 2097152, mais la longueur d'argument maximale que je peux passer est toujours 131071 (et je n'ai pas à déduire la taille de l'environnement).xargs
et même defind -exec
vos amis lorsque vous traitez avec des listes d'arguments géantes.getconf
est au niveau du noyau je pense. Peut-être que bash définit une limite inférieure par sa conception / configuration? De plus, ma connaissance de cela vient d'il y a quelque temps, donc il se pourrait que les choses aient changé un peu récemment, bien que ce ne soit pas un domaine dans lequel je m'attends à voir beaucoup de mouvement, sauf dans de nouveaux obus expérimentaux.ksh
,zsh
,dash
,fish
et Bash 3 comme je l'ai fait dans Bash 4. Le message d'erreurfish
peut être informatif: « poissons: La taille totale de l'argument et les listes environnement (130kb) dépasse la limite du système d'exploitation de 2.0MB . " Cependant,set | wc -c
306317 etenv | wc -c
2507 ne tiennent pas compte de la différence. Je ne sais pas quoi d'autre est compté.ARG_MAX limite en effet la taille totale de la ligne de commande et de l'environnement, mais vous êtes confronté à une limitation supplémentaire: un argument ne doit pas être plus long que MAX_ARG_STRLEN (qui est malheureusement codé en dur pour être 131072).
Voir /unix/120642/what-defines-the-maximum-size-for-a-command-single-argument
la source
Voulez-vous dire quelle est la longueur variable la plus longue? Pour comprendre cela, vous pouvez utiliser le «x» de perl pour créer un nom de variable très long:
Sur mon système, le 131071 fonctionne:
et la variable est imprimée à 131072, elle est trop grande:
la source
perl
un script:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/null
.printf
que le shell est intégré, doncbash
n'a pas besoin de faire unexec()
pour générer un autre processus.ARG_MAX
n'importe à la longueur de la liste des arguments desexec
fonctions (exec()
,execl()
,execlp()
,execvp()
,execvpe()
, etc.).