Limite de caractères de ligne de commande Linux

27

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.

robdog
la source
1
Je ne comprends pas la question. Êtes-vous intéressé par la limite de caractères?
krissi
Vous devez formuler votre question plus clairement, sinon ça va juste se fermer.
ThatGraemeGuy

Réponses:

27

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_MAXvous 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.

David Spillett
la source
2
Sur mon système, getconf ARG_MAXdonne 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).
pause jusqu'à nouvel ordre.
1
Souvenez-vous également de cela xargset même de find -execvos amis lorsque vous traitez avec des listes d'arguments géantes.
coredump
@Dennis: la valeur retournée par getconfest 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.
David Spillett
Je reçois les mêmes résultats ksh, zsh, dash, fishet Bash 3 comme je l'ai fait dans Bash 4. Le message d'erreur fishpeut ê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 -c306317 et env | wc -c2507 ne tiennent pas compte de la différence. Je ne sais pas quoi d'autre est compté.
pause jusqu'à nouvel ordre.
11

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

Rotsor
la source
1

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
Davey
la source
2
En fait, c'est une valeur variable très longue .
pause jusqu'à nouvel ordre.
3
De plus, vous n'avez pas besoin d'utiliser perlun script:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
pause jusqu'à nouvel ordre.
@DennisWilliamson fonctionne cependant printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/null.
jarno
C'est parce printfque le shell est intégré, donc bashn'a pas besoin de faire un exec()pour générer un autre processus. ARG_MAXn'importe à la longueur de la liste des arguments des execfonctions ( exec(), execl(), execlp(), execvp(), execvpe(), etc.).
Vicente Olivert Riera