J'ai voulu executer une commande toute bete sous ma RedHat preférée: ls
$ ls | wc
14223 14223 456221
$ ls *.hxx
bash: /bin/ls: Liste d'arguments trop longue
C'est fou qd meme, non ?
quelqu'un a une explication sur l'algo employé derrière ?
# Re: ls ???
Posté par jmfayard . Évalué à 1.
$ rm -f *log # 3000 fichiers
ls *.hxx
est interpolé par bash en une ligne de commande trop longue pour qu'il puisse l'interpréter.
Il doit y avoir quelque part un :
#define BUFFER_L xxxxx
char buffer[BUFFER_L] ;
Solution :
$ find . -name "*.hxx"
[^] # Re: ls ???
Posté par Cédric Foll . Évalué à 3.
En général on peut s'en sortir comme ça.
[^] # Re: ls ???
Posté par free2.org . Évalué à 1.
mais en gros les caracteres spéciaux comme * sont remplacés par tous les noms qu'ils désignent, et tous ces arguments sont ensuite fournis à la commande de début de ligne (ici /bin/ls) dans les fameux parametres de la fonction C main(argc,argv)
[^] # Re: ls ???
Posté par free2.org . Évalué à 1.
echo *.truc
pour mieux comprendre ce qui se passe
# Re: ls ???
Posté par ptit_tux . Évalué à 4.
C'est ls qui liste les entrées.
$ ls *.hxx
C'est bash qui substitue "*.hxx" par les noms des fichiers qui correspondent au motif.
Tu peux essayer "echo *.hxx" et tu auras le même problème.
Sinon bash doit passer par exec() pour lancer une commande :
/usr/include/linux/limits.h :
#define ARG_MAX 131072 /* # bytes of args + environ for exec() */
[^] # Re: ls ???
Posté par Pascal Terjan (site web personnel) . Évalué à 1.
# Re: ls ???
Posté par Pascal Terjan (site web personnel) . Évalué à 2.
ls `seq -w 99999` passe (99999*6caracteres...)
par contre ls `seq -w 100000` non (100000*7caracteres)
[^] # Re: ls ???
Posté par RB . Évalué à 2.
la limite:
ls `seq -w 21220` aaaa
6 * 21220 + 6 = 127326
Donc il y a quelque chose comme 128ko pour les arguments.
# Re: ls ???
Posté par pllevy . Évalué à 4.
http://mail.gnu.org/archive/html/bug-fileutils/2002-07/msg00035.htm(...)
On peut donc remplacer la commande ls *.hxx par ls | xargs echo.
Et obtenir la taille max des arguments par getconf ARG_MAX (en provenance directe du kernel)
[^] # Re: ls ???
Posté par Mathieu Malaterre (site web personnel) . Évalué à 1.
# Re: ls ???
Posté par B r u n o (site web personnel) . Évalué à 1.
Comme dit un precedent commentaire, un find devrait faire l'affaire :)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.