OVH Cloud OVH Cloud

Expansion des accolades

5 réponses
Avatar
Alain Ketterlin
Salut tout le monde,

Y a-t-il quelque part une routine qui fasse ce que fait wordexp(3)
plus l'expansion des accolades ? L'ideal serait qu'elle soit
disponible sous linux et freebsd.

Si ce n'est pas le cas, quel serait le meilleur moyen d'utiliser
le shell lui-meme (via fork+exec avec un pipe pour recuperer les
resultats) pour faire l'expansion ? Y a-t-il mieux que echo ?

(Je connais tous les problemes de securite potentiels lies a $(...)
etc. mais ce n'est pas un probleme ici, puisque c'est pour ecrire un
shell.)

Merci d'avance pour vos conseils eclaires.

-- Alain.

5 réponses

Avatar
DINH Viêt Hoà

Y a-t-il quelque part une routine qui fasse ce que fait wordexp(3)
plus l'expansion des accolades ? L'ideal serait qu'elle soit
disponible sous linux et freebsd.


wordexp() est disponible sous linux et freebsd.
Elle fait partie du standard POSIX.
tu as également glob().

Qu'appelles-tu "expansion des accolades" ? As-tu un exemple ?

--
DINH V. Hoa,

"t'as 2 de QI ou quoi ?" -- Cent-Quarante-Six

Avatar
Alain Ketterlin
DINH Viêt Hoà writes:


Y a-t-il quelque part une routine qui fasse ce que fait wordexp(3)
plus l'expansion des accolades ? L'ideal serait qu'elle soit
disponible sous linux et freebsd.


wordexp() est disponible sous linux et freebsd.
Elle fait partie du standard POSIX.


Oui, pas de probleme, mais elle ne me suffit pas.

tu as également glob().


Oui mais seulement pour les noms de fichiers. J'aimerais en plus les
variables, les baskquotes, etc.

Qu'appelles-tu "expansion des accolades" ? As-tu un exemple ?


Oui pardon. Je voulais dire "a la bash" (ou a la csh), c'est-a-dire
que f{1,2,3} devient f1 f2 f3.

wordexp() ne s'occupe que de l'expansion selon sh. En fait, ce que
j'aimerais, c'est une expansion complete telle que realisee par le
shell de l'utilisateur (comme wordexp() si c'est sh, avec en plus les
accolades si c'est bash/csh, etc.)

En fait je pense que le plus simple serait de laisser faire le shell
en question (via pipe/fork/dup/exec etc). Je peux recuperer le shell
par defaut (via getpwent()), mais y a-t-il moyen de savoir si mon
programme a ete lance par un autre shell ?

-- Alain.


Avatar
DINH Viêt Hoà

wordexp() est disponible sous linux et freebsd.
Elle fait partie du standard POSIX.


Oui, pas de probleme, mais elle ne me suffit pas.

tu as également glob().


Oui mais seulement pour les noms de fichiers. J'aimerais en plus les
variables, les baskquotes, etc.


Je ne crois pas que cela existe.

Qu'appelles-tu "expansion des accolades" ? As-tu un exemple ?


Oui pardon. Je voulais dire "a la bash" (ou a la csh), c'est-a-dire
que f{1,2,3} devient f1 f2 f3.

wordexp() ne s'occupe que de l'expansion selon sh. En fait, ce que
j'aimerais, c'est une expansion complete telle que realisee par le
shell de l'utilisateur (comme wordexp() si c'est sh, avec en plus les
accolades si c'est bash/csh, etc.)

En fait je pense que le plus simple serait de laisser faire le shell
en question (via pipe/fork/dup/exec etc). Je peux recuperer le shell
par defaut (via getpwent()), mais y a-t-il moyen de savoir si mon
programme a ete lance par un autre shell ?


Hum ... Tu veux écrire un shell en utilisant un autre shell ?
Tu ne crois pas zsh ou bash suffise ?

Ou bien, c'est par pur exercice ? et à ce moment-là, il est plus
propre d'écrire soit-même l'expansion plutôt qu'utiliser un autre
processus, ou bien tu peux reprendre le code de bash, si c'est
l'expansion de bash que tu recherches.

--
DINH V. Hoa,

"t'as 2 de QI ou quoi ?" -- Cent-Quarante-Six


Avatar
Alain Ketterlin
DINH Viêt Hoà writes:

Hum ... Tu veux écrire un shell en utilisant un autre shell ?


En gros oui.

(Au fait, sous freebsd 5.3 wordexp() lance un sh. C'est de la que j'ai
peche l'idee.)

Tu ne crois pas zsh ou bash suffise ?


Non, pas dans mon cas. Mais ce n'est pas la question.

Ou bien, c'est par pur exercice ? et à ce moment-là, il est plus
propre d'écrire soit-même l'expansion plutôt qu'utiliser un autre
processus, ou bien tu peux reprendre le code de bash, si c'est
l'expansion de bash que tu recherches.


OK, je vais regarder, merci.

-- Alain.

Avatar
Stephane Chazelas
2004-12-11, 10:49(+01), Alain Ketterlin:
[...]
Qu'appelles-tu "expansion des accolades" ? As-tu un exemple ?


Oui pardon. Je voulais dire "a la bash" (ou a la csh), c'est-a-dire
que f{1,2,3} devient f1 f2 f3.

wordexp() ne s'occupe que de l'expansion selon sh. En fait, ce que
j'aimerais, c'est une expansion complete telle que realisee par le
shell de l'utilisateur (comme wordexp() si c'est sh, avec en plus les
accolades si c'est bash/csh, etc.)


C'est normal. Meme dans les shells qui supportent {...}, la
"brace expansion" n'est pas du tout liee a la "filename
generation".

Le shell fait d'abord la "brace expansion", puis la filename
generation.

Donc, tu peux interpreter les braces et appeler wordexp sur
chaque argument resultant.

--
Stephane