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.
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.
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ée env | 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.
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 de find -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'erreur fish
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 et env | 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
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:
VAR=`perl -e 'print "a"x131071'` ; bash a.sh $VAR
Sur mon système, le 131071 fonctionne:
et la variable est imprimée à 131072, elle est trop grande:
VAR=`perl -e 'print "a"x131072'` ; bash a.sh $VAR
bash: /bin/bash: Argument list too long
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é, donc bash
n'a pas besoin de faire un exec()
pour générer un autre processus. ARG_MAX
n'importe à la longueur de la liste des arguments des exec
fonctions ( exec()
, execl()
, execlp()
, execvp()
, execvpe()
, etc.).