web-dev-qa-db-fra.com

Bash ligne de commande et limite d'entrée

Existe-t-il une sorte de limite de caractère imposée dans bash (ou dans d'autres coquilles) pendant combien de temps une entrée peut-elle être? Si oui, quelle est cette limite de personnage?

C'est à dire. Est-il possible d'écrire une commande dans bash trop longue pour que la ligne de commande s'exécute? S'il n'y a pas de limite requise, y a-t-il une limite suggérée?

80
Derek Halden

La limite de longueur d'une ligne de commande n'est pas imposée par le shell mais par le système d'exploitation. Cette limite est généralement de l'ordre de cent kilo-octets. POSIX dénote cette limite ARG_MAX et sur les systèmes conformes à POSIX, vous pouvez l'interroger avec

$ getconf ARG_MAX    # Get argument limit in bytes

Par exemple. sur Cygwin, il s’agit de 32000, et sur les différents systèmes BSD et Linux que j’utilise, il est situé entre 131072 et 2621440.

Si vous devez traiter une liste de fichiers dépassant cette limite, consultez l'utilitaire xargs, qui appelle un programme à plusieurs reprises avec un sous-ensemble d'arguments ne dépassant pas ARG_MAX.

Pour répondre à votre question spécifique, oui, il est possible d’essayer d’exécuter une commande avec une liste d’arguments trop longue. Le shell affichera une erreur en indiquant "liste d'arguments trop longue".

Notez que entrée dans un programme (lu sur stdin ou tout autre descripteur de fichier) est pas limité (uniquement par les ressources de programme disponibles). Donc, si votre script Shell lit une chaîne dans une variable, vous n'êtes pas limité par ARG_MAX. La restriction ne s'applique pas non plus aux commandes intégrées à Shell.

111
Jens

Ok, Denizens. J'ai donc accepté les limites de longueur de ligne de commande en tant qu'évangile pendant un certain temps. Alors, que faire avec ses hypothèses? Naturellement, vérifiez-les.

J'ai une machine Fedora 22 à ma disposition (ce qui signifie: Linux avec bash4). J'ai créé un répertoire contenant 500 000 inodes (fichiers) dans chacun de 18 caractères. La longueur de la ligne de commande est de 9 500 000 caractères. Créé ainsi:

seq 1 500000 | while read digit; do
    touch $(printf "abigfilename%06d\n" $digit);
done

Et nous notons:

$ getconf ARG_MAX
2097152

Notez cependant que je peux le faire:

$ echo * > /dev/null

Mais cela échoue:

$ /bin/echo * > /dev/null
bash: /bin/echo: Argument list too long

Je peux lancer une boucle for:

$ for f in *; do :; done

qui est un autre shell intégré.

Lecture attentive du documentation pour ARG_MAX états, Longueur maximale des arguments des fonctions exec . Cela signifie: sans appeler exec, il n'y a pas de ARG_MAX limitation. Cela expliquerait donc pourquoi les commandes intégrées de Shell ne sont pas restreintes par ARG_MAX.

Et en effet, je peux ls mon répertoire si ma liste d’arguments contient 109948 fichiers, soit environ 2 089 000 caractères (à peu près égales). Une fois que j’ajoute un fichier de nom de fichier de 18 caractères supplémentaire, je reçois une erreur liste d’arguments trop longue . Alors ARG_MAX fonctionne comme annoncé: l'exécutable échoue avec plus de ARG_MAX caractères sur la liste d'arguments, y compris, il convient de noter, les données d'environnement.

40
Mike S