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.


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.


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.


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.