[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Taille de la ligne de commande, était: Re: Récursivité - shred



Jacques L'helgoualc'h, mardi 6 novembre 2007, 12:49:12 CET
> 
> Sylvain Sauvage a écrit, mardi 6 novembre 2007, à 12:13 :
> [...]
> >   Pas tout à fait ;o) : xargs découpe la suite des arguments
> > en paquets selon la valeur de l???option -s (nombre de
> > caractères de la ligne), laquelle est par défaut 131072, y
> > compris les variables d???environnement, donc, en pratique,
> > les limitations du shell (mais parce que ce sont celles du
> > noyau).
> 
> OK, merci.
> 
> $ echo {1..123456} | xargs echo | while read f;do echo $f |
> wc;done 1   23042  127146
>       1   21191  127146
>       1   21191  127146
>       1   21191  127146
>       1   20075  127141
>       1   16766  117362
> 
> $ env|wc
>      52      74    1871
> 
> La commande « env » ne donne pas tout, ou il y a autre chose
> qui explique la différence entre 131072 et 127146 ?

  Et bien, pour le echo, wc ne compte pas exactement la taille
des chaînes, il compte les chiffres et les espaces les séparant.
Ça ne doit pas être loin du compte : il manque juste « echo »
lui-même.

  Quant à env, cette commande affiche les variables sous la
forme VAR=VALEUR. Ça tombe bien parce que la variable qui doit
contenir tout ça est un bête tableau de chaînes « VAR=VALEUR ».

  On pourrait aussi compter l’empreinte mémoire de la structure
de ce « dictionnaire » et donc ajouter sizeof(char*)*52.
  Mais en fait, non¹.

  Avec ça, on se rapproche un peu : 127146 (args) + 5 (echo) +
1871 (env) = 129022.

  Ensuite, POSIX.2 demande à ce que l’on conserve un marge de
2048 octets¹.

¹ : j’ai triché : j’ai regardé les sources de xargs…

  Et donc : 129022 + 2048, ça fait 131070.

  Il manque encore 2. Or, d’après les sources toujours, il faut
les enlever pour Linux/PPC (mais je ne sais pas pourquoi).

  Bon, on a du bol que ça tombe juste : 127146 est une borne
inférieure pour ton environnement. En effet, il pourrait rester
un peu de place pour un autre argument car, à ce moment-là, tes
arguments font déjà au moins 5 caractères (> 23042 ; ça fait 6
avec le séparateur).

  Et voilà.
-- 
 Sylvain Sauvage



Reply to: