Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[un peu HS] argc, argv et exec*()

2 réponses
Avatar
BERTRAND Jo=c3=abl
Bonjour Í  tous,

Pardonnez-moi le hors sujet léger. Je tombe sur un problème que je ne
comprends pas tout Í  fait.

J'essaie de lire un fichier XML trivial (mais long) Í  coup de awk avant
de passer le résultat dans une moulinette (en C, mais lÍ  n'est pas la
question) pour trier les différentes données.

En ligne de commande, je commence Í  traiter mon fichier XML comme ceci :

awk 'BEGIN { I=0; } /<comp ref=.*>/ { I=I+1; } { if (I>0) print; }
/<\/comp>/ { I=I-1; }' alimentations_haute_tension.xml

et ça fonctionne parfaitement. J'extrais tous les blocs <comp
ref=xxx>...</comp>, même les blocs récursifs. Je n'ai pas besoin de plus
pour l'instant.

Comme le traitement doit être automatique, j'ai donc collé cela dans un
programme en C avec un execvp(). Extrait :

...
{
for(i = 0; i <= nombre_arguments; i++)
printf("%d: %s\n", i, arguments[i]);

execvp(arguments[0], arguments);
}
...

Je vous fais grÍ¢ce de ce qui est avant et après ce traitement, en
particulier la grouille avec fork() et j'en passe.

Sur la console, j'obtiens bien :
0: awk
1: 'BEGIN { I=0; } /<comp ref=.*>/ { I=I+1; } { if (I>0) print; }
/<\/comp>/ { I=I-1; }'
2: alimentations_haute_tension.xml
3: (null)

Donc argc[0] vaut awk, argc[1] vaut bien le contenu du script awk et
argc[2] le nom du xml Í  analyser.

Résultat :

"awk: ligne de commande:1: 'BEGIN { I=0; } /<comp ref=.*>/ { I=I+1; } {
if (I>0) print; } /<\/comp>/ { I=I-1; }'"

Et lÍ , je ne comprends plus, d'autant que si je copie simplement les
trois valeurs dans un shell, ça fonctionne. Je suis preneur de toute
lumière.

Bien cordialement,

JKB

2 réponses

Avatar
̓‰tienne Mollier
--0F1p//8PRICkK4MW
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
Bonjour,
Je crois que le probl̓¨me vient des simple quotes surnum̓©raires
en d̓©but et fin d'expression
BERTRAND Jo̓«l, on 2020-11-01 10:34:14 +0100:
Sur la console, j'obtiens bien :
0: awk
1: 'BEGIN { I=0; } /<comp ref=.*>/ { I=I+1; } { if (I>0) print; } /</comp>/ { I=I-1; }'

ici: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
$ ls
alimentations_haute_tension.xml truc truc.c
$ ./truc
0: awk
1: BEGIN { I=0; } /<comp ref=.*>/ { I=I+1; } { if (I>0) print; } /</comp>/ { I=I-1; }
2: alimentations_haute_tension.xml
3: (null)
2: alimentations_haute_tension.xml
3: (null)
Donc argc[0] vaut awk, argc[1] vaut bien le contenu du script awk et
argc[2] le nom du xml ̓  analyser.
R̓©sultat :
"awk: ligne de commande:1: 'BEGIN { I=0; } /<comp ref=.*>/ { I=I+1; } { if (I>0) print; } /</comp>/ { I=I-1; }'"

En ajoutant les simple quotes en Debian Sid, j'obtiens bien une
erreur similaire, modulo la localisation:
$ ./truc
0: awk
1: 'BEGIN { I=0; } /<comp ref=.*>/ { I=I+1; } { if (I>0) print; } /</comp>/ { I=I-1; }'
2: alimentations_haute_tension.xml
3: (null)
awk: cmd. line:1: 'BEGIN { I=0; } /<comp ref=.*>/ { I=I+1; } { if (I>0) print; } /</comp>/ { I=I-1; }'
awk: cmd. line:1: ^ invalid char ''' in expression
J'imagine que la solution de contournement fait l'affaire, mais
si ̓§a peut ̓©clairer votre lanterne...
Bonne soir̓©e,
--
̓‰tienne Mollier
Old rsa/3072: 5ab1 4edf 63bb ccff 8b54 2fa9 59da 56fe fff3 882d
New rsa/4096: 8f91 b227 c7d6 f2b1 948c 8236 793c f67e 8f0d 11da
Sent from /dev/pts/3, please excuse my verbosity.
--0F1p//8PRICkK4MW
Content-Type: application/pgp-signature; name="signature.asc"
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEj5GyJ8fW8rGUjII2eTz2fo8NEdoFAl+fAlIACgkQeTz2fo8N
Edr0xBAAjnWLhP0eJLfY730bF9hiLUiH7/RawtslTBBUURUNjHb2Q/p275WsZmTd
pM0VzULT54qbYhh83NQcwdOPA/nUp+ACh+7MuYwxEY8F8Bk4eIH3lbdYVVZ023jz
QuIOGj/BGdnMo0AQIVTT8yoFfQI0SrFBXkKumyc8VmV9VXvhj7A2A03RzZY05flD
TWDYv5+XdIQ+Bgq4UnHaFGkEB0LStp6RzL2/uqjBuHrjMhk5SCDUq94L5ZLlcPNd
01fjV6LI8/oA+nQDRWrQ6hoJMhVUb+go1Pkpxfi84HuYWZWgYebv5xa8hki9sdVe
WO2DPvQtgu9wM+kUvVsV9IOFJDa82nG3Wcbn3x5p2ZGT8FmsCxmGwUoYGYz2ad5G
Cs5Xe1Y9V/Q/f5o9VuU07bbF9Xd5/gHe9Z7VDD94SQXWvIB7R4GslYRSpUcTBiib
gjresLxfcaILWXc0ZxgUqPR9Z9W8142PhRg9WF/8l+YTa6ksfo2Q6bHaDy77ON5z
jhthJugHyDphamSl7Lee5ktTDVm/3OPSDSQ5MVHSYPL8idSTbQNhijSW6u02dKj7
8zCvw+FsMFr1nfgToc77g1wqa8wLYKcdF/92TfW4tX4/UEKyzEDa7Wln1HEfbJvZ
W6L6A581ACRlSLTOr4CsDvfBu22ieX7V2o3jwXi/5p0bUu1MMDA=1lg5
-----END PGP SIGNATURE-----
--0F1p//8PRICkK4MW--
Avatar
Marc Chantreux
salut Joël,
0: sh
1: -c
2: awk 'BEGIN { I=0; } /<comp ref=.*>/ { I=I+1; } { if (I>0) print; }
/</comp>/ { I=I-1; }' alimentations_haute_tension.xml
3: (null)

du coup, pour ma culture personnelle: quelle raison t'a poussé Í  choisir
du C plutÍ´t que de faire un script shell?
Je n'ai pas posé la question jusqu'a maintenant mais la question me
brule: tu fais visiblement des forks dans tous les sens et c'est
typiquement le genre de mécaniques pour lesquelles c'est
traditionellement le shell qui est utilisé. je me disais que tu te
passais de cette dépendance avec un programme en C mais si tu dégaines
sh -c, ca n'est plus une explication.
cordialement,
marc