evaluation indirecte de paramètre en shell portable
22 réponses
rixed
Coucou la liste.
Je suppose que c'est une FAQ, mais je n'ai pas réussit à mettre la main
sur la FAQ du groupe.
Donc, question :
Sous zsh, on peut faire :
$ toto="valeur de toto"
$ titi=toto
$ echo ${(P)titi}
valeur de toto
$ youpi
command not found: youpi
J'aimerai savoir s'il n'y a pas moyen de faire cela en shell portable.
Genre quelquechose qui fonctionnerait aussi bien avec bash, zsh, tcsh...
Et pourquoi pas aussi en shell POSIX.
Je suppose que c'est une FAQ, mais je n'ai pas réussit à mettre la main sur la FAQ du groupe.
Donc, question :
Sous zsh, on peut faire :
$ toto="valeur de toto" $ titi=toto $ echo ${(P)titi} valeur de toto $ youpi command not found: youpi
J'aimerai savoir s'il n'y a pas moyen de faire cela en shell portable. Genre quelquechose qui fonctionnerait aussi bien avec bash, zsh, tcsh... Et pourquoi pas aussi en shell POSIX.
Moi, ce que j'aimerai savoir, c'est pourquoi tu ne lis pas: man bash ?
-- __Pascal Bourguignon__ http://www.informatimago.com/ Until real software engineering is developed, the next best practice is to develop with a dynamic system that has extreme late binding in all aspects. The first system to really do this in an important way is Lisp. -- Alan Kay
rixed <rixed@happyleptic.org> writes:
Coucou la liste.
Je suppose que c'est une FAQ, mais je n'ai pas réussit à mettre la main
sur la FAQ du groupe.
Donc, question :
Sous zsh, on peut faire :
$ toto="valeur de toto"
$ titi=toto
$ echo ${(P)titi}
valeur de toto
$ youpi
command not found: youpi
J'aimerai savoir s'il n'y a pas moyen de faire cela en shell portable.
Genre quelquechose qui fonctionnerait aussi bien avec bash, zsh, tcsh...
Et pourquoi pas aussi en shell POSIX.
Moi, ce que j'aimerai savoir, c'est pourquoi tu ne lis pas:
man bash
?
--
__Pascal Bourguignon__ http://www.informatimago.com/
Until real software engineering is developed, the next best practice
is to develop with a dynamic system that has extreme late binding in
all aspects. The first system to really do this in an important way
is Lisp. -- Alan Kay
Je suppose que c'est une FAQ, mais je n'ai pas réussit à mettre la main sur la FAQ du groupe.
Donc, question :
Sous zsh, on peut faire :
$ toto="valeur de toto" $ titi=toto $ echo ${(P)titi} valeur de toto $ youpi command not found: youpi
J'aimerai savoir s'il n'y a pas moyen de faire cela en shell portable. Genre quelquechose qui fonctionnerait aussi bien avec bash, zsh, tcsh... Et pourquoi pas aussi en shell POSIX.
Moi, ce que j'aimerai savoir, c'est pourquoi tu ne lis pas: man bash ?
-- __Pascal Bourguignon__ http://www.informatimago.com/ Until real software engineering is developed, the next best practice is to develop with a dynamic system that has extreme late binding in all aspects. The first system to really do this in an important way is Lisp. -- Alan Kay
Stephane Chazelas
2006-02-27, 23:11(+00), rixed: [...]
Donc, question :
Sous zsh, on peut faire :
$ toto="valeur de toto" $ titi=toto $ echo ${(P)titi} valeur de toto $ youpi command not found: youpi
J'aimerai savoir s'il n'y a pas moyen de faire cela en shell portable.
Et tu l'aimeras quand?
Genre quelquechose qui fonctionnerait aussi bien avec bash, zsh, tcsh... Et pourquoi pas aussi en shell POSIX. [...]
eval "star_titi=$$titi" printf '%sn' "$star_titi"
(en shell portable, on n'utilise pas echo).
Note que ca ne fait pas de sens d'ecrire du code qui marche a la fois en shell bourne-like et en csh-like, ce sont deux familles completement incompatibles.
-- Stéphane
2006-02-27, 23:11(+00), rixed:
[...]
Donc, question :
Sous zsh, on peut faire :
$ toto="valeur de toto"
$ titi=toto
$ echo ${(P)titi}
valeur de toto
$ youpi
command not found: youpi
J'aimerai savoir s'il n'y a pas moyen de faire cela en shell portable.
Et tu l'aimeras quand?
Genre quelquechose qui fonctionnerait aussi bien avec bash, zsh, tcsh...
Et pourquoi pas aussi en shell POSIX.
[...]
eval "star_titi=$$titi"
printf '%sn' "$star_titi"
(en shell portable, on n'utilise pas echo).
Note que ca ne fait pas de sens d'ecrire du code qui marche a la
fois en shell bourne-like et en csh-like, ce sont deux familles
completement incompatibles.
$ toto="valeur de toto" $ titi=toto $ echo ${(P)titi} valeur de toto $ youpi command not found: youpi
J'aimerai savoir s'il n'y a pas moyen de faire cela en shell portable.
Et tu l'aimeras quand?
Genre quelquechose qui fonctionnerait aussi bien avec bash, zsh, tcsh... Et pourquoi pas aussi en shell POSIX. [...]
eval "star_titi=$$titi" printf '%sn' "$star_titi"
(en shell portable, on n'utilise pas echo).
Note que ca ne fait pas de sens d'ecrire du code qui marche a la fois en shell bourne-like et en csh-like, ce sont deux familles completement incompatibles.
-- Stéphane
ccellier
On 2006-02-28, Pascal Bourguignon wrote:
Moi, ce que j'aimerai savoir, c'est pourquoi tu ne lis pas: man bash ?
Qu'est-ce qui te fait croire que je ne l'ai pas lu ?
On 2006-02-28, Pascal Bourguignon <usenet@informatimago.com> wrote:
Moi, ce que j'aimerai savoir, c'est pourquoi tu ne lis pas:
man bash
?
Qu'est-ce qui te fait croire que je ne l'ai pas lu ?
Moi, ce que j'aimerai savoir, c'est pourquoi tu ne lis pas: man bash ?
Qu'est-ce qui te fait croire que je ne l'ai pas lu ?
ccellier
On 2006-02-28, Stephane Chazelas wrote:
Et tu l'aimeras quand?
Qui donc ?
Genre quelquechose qui fonctionnerait aussi bien avec bash, zsh, tcsh... Et pourquoi pas aussi en shell POSIX. [...]
eval "star_titi=$$titi"
Bon sang mais c'est bien sur ! Merci beaucoup !
(en shell portable, on n'utilise pas echo).
man echo m'informe que :
STANDARDS The echo utility conforms to IEEE Std 1003.1-2001 (``POSIX.1'') as amended by Cor. 1-2002.
C'est l'amendement qui pose problème ?
Quoi qu'il en soit, la portabilité est une grandeur analogique. Echo est largement assez portable pour mon besoin.
Note que ca ne fait pas de sens d'ecrire du code qui marche a la fois en shell bourne-like et en csh-like, ce sont deux familles completement incompatibles.
OK.
On 2006-02-28, Stephane Chazelas <cette.adresse@est.invalid> wrote:
Et tu l'aimeras quand?
Qui donc ?
Genre quelquechose qui fonctionnerait aussi bien avec bash, zsh, tcsh...
Et pourquoi pas aussi en shell POSIX.
[...]
eval "star_titi=$$titi"
Bon sang mais c'est bien sur !
Merci beaucoup !
(en shell portable, on n'utilise pas echo).
man echo m'informe que :
STANDARDS
The echo utility conforms to IEEE Std 1003.1-2001 (``POSIX.1'') as
amended by Cor. 1-2002.
C'est l'amendement qui pose problème ?
Quoi qu'il en soit, la portabilité est une grandeur analogique.
Echo est largement assez portable pour mon besoin.
Note que ca ne fait pas de sens d'ecrire du code qui marche a la
fois en shell bourne-like et en csh-like, ce sont deux familles
completement incompatibles.
Genre quelquechose qui fonctionnerait aussi bien avec bash, zsh, tcsh... Et pourquoi pas aussi en shell POSIX. [...]
eval "star_titi=$$titi"
Bon sang mais c'est bien sur ! Merci beaucoup !
(en shell portable, on n'utilise pas echo).
man echo m'informe que :
STANDARDS The echo utility conforms to IEEE Std 1003.1-2001 (``POSIX.1'') as amended by Cor. 1-2002.
C'est l'amendement qui pose problème ?
Quoi qu'il en soit, la portabilité est une grandeur analogique. Echo est largement assez portable pour mon besoin.
Note que ca ne fait pas de sens d'ecrire du code qui marche a la fois en shell bourne-like et en csh-like, ce sont deux familles completement incompatibles.
OK.
Stephane Chazelas
On 28 Feb 2006 10:11:44 GMT, wrote: [...]
(en shell portable, on n'utilise pas echo).
man echo m'informe que :
STANDARDS The echo utility conforms to IEEE Std 1003.1-2001 (``POSIX.1'') as amended by Cor. 1-2002.
Et un autre echo te dira autre chose. POSIX et Unix en particulier ont des divergences. POSIX est suffisemment vague pour permettre n'importe quoi.
echo -n echo ''
En particulier, selon Unix (SUSv3, XSI extension) doit afficher "-n" et "". D'apres POSIX, le premier est "unspecified" et le deuxieme peut afficher "" ou "".
Dans tous les cas, echo ne doit pas etre utilisé pour afficher des choses "variables".
En particulier GNU echo et le echo de bash ne sont pas POSIX (encore moins Unix).
[...]
Quoi qu'il en soit, la portabilité est une grandeur analogique. Echo est largement assez portable pour mon besoin.
C'est surtout qu'il n'est pas fiable et qu'il est deprecated.
POSIX recommande de ne pas l'utiliser:
SUSv3> It is not possible to use echo portably across all POSIX SUSv3> systems unless both -n (as the first argument) and escape SUSv3> sequences are omitted.
donc, pas pour des donnees variables (a moins qu'il y ait une contrainte qui impose qu'elles ne contiennent pas de backslash et qui interdit "-n").
SUSv3> [...] SUSv3> New applications are encouraged to use printf instead of SUSv3> echo. SUSv3> [...] SUSv3> The echo utility has not been made obsolescent because of SUSv3> its extremely widespread use in historical applications. SUSv3> Conforming applications that wish to do prompting without SUSv3> <newline>s or that could possibly be expecting to echo a SUSv3> -n, should use the printf utility derived from the Ninth SUSv3> Edition system.
-- Stephane
On 28 Feb 2006 10:11:44 GMT, ccellier@evistel.com wrote:
[...]
(en shell portable, on n'utilise pas echo).
man echo m'informe que :
STANDARDS
The echo utility conforms to IEEE Std 1003.1-2001 (``POSIX.1'') as
amended by Cor. 1-2002.
Et un autre echo te dira autre chose. POSIX et Unix en
particulier ont des divergences. POSIX est suffisemment vague
pour permettre n'importe quoi.
echo -n
echo '\'
En particulier, selon Unix (SUSv3, XSI extension) doit afficher
"-n" et "". D'apres POSIX, le premier est "unspecified" et le
deuxieme peut afficher "" ou "\".
Dans tous les cas, echo ne doit pas etre utilisé pour afficher
des choses "variables".
En particulier GNU echo et le echo de bash ne sont pas POSIX
(encore moins Unix).
[...]
Quoi qu'il en soit, la portabilité est une grandeur analogique.
Echo est largement assez portable pour mon besoin.
C'est surtout qu'il n'est pas fiable et qu'il est deprecated.
POSIX recommande de ne pas l'utiliser:
SUSv3> It is not possible to use echo portably across all POSIX
SUSv3> systems unless both -n (as the first argument) and escape
SUSv3> sequences are omitted.
donc, pas pour des donnees variables (a moins qu'il y ait une
contrainte qui impose qu'elles ne contiennent pas de backslash
et qui interdit "-n").
SUSv3> [...]
SUSv3> New applications are encouraged to use printf instead of
SUSv3> echo.
SUSv3> [...]
SUSv3> The echo utility has not been made obsolescent because of
SUSv3> its extremely widespread use in historical applications.
SUSv3> Conforming applications that wish to do prompting without
SUSv3> <newline>s or that could possibly be expecting to echo a
SUSv3> -n, should use the printf utility derived from the Ninth
SUSv3> Edition system.
STANDARDS The echo utility conforms to IEEE Std 1003.1-2001 (``POSIX.1'') as amended by Cor. 1-2002.
Et un autre echo te dira autre chose. POSIX et Unix en particulier ont des divergences. POSIX est suffisemment vague pour permettre n'importe quoi.
echo -n echo ''
En particulier, selon Unix (SUSv3, XSI extension) doit afficher "-n" et "". D'apres POSIX, le premier est "unspecified" et le deuxieme peut afficher "" ou "".
Dans tous les cas, echo ne doit pas etre utilisé pour afficher des choses "variables".
En particulier GNU echo et le echo de bash ne sont pas POSIX (encore moins Unix).
[...]
Quoi qu'il en soit, la portabilité est une grandeur analogique. Echo est largement assez portable pour mon besoin.
C'est surtout qu'il n'est pas fiable et qu'il est deprecated.
POSIX recommande de ne pas l'utiliser:
SUSv3> It is not possible to use echo portably across all POSIX SUSv3> systems unless both -n (as the first argument) and escape SUSv3> sequences are omitted.
donc, pas pour des donnees variables (a moins qu'il y ait une contrainte qui impose qu'elles ne contiennent pas de backslash et qui interdit "-n").
SUSv3> [...] SUSv3> New applications are encouraged to use printf instead of SUSv3> echo. SUSv3> [...] SUSv3> The echo utility has not been made obsolescent because of SUSv3> its extremely widespread use in historical applications. SUSv3> Conforming applications that wish to do prompting without SUSv3> <newline>s or that could possibly be expecting to echo a SUSv3> -n, should use the printf utility derived from the Ninth SUSv3> Edition system.
-- Stephane
Nicolas George
Pascal Bourguignon wrote in message :
Moi, ce que j'aimerai savoir, c'est pourquoi tu ne lis pas: man bash ?
Parce que quitte à utiliser des fonctionnalités non-standard de shells, autant utiliser celles de zsh, qui sont plus intéressantes.
Pascal Bourguignon wrote in message
<877j7g6o3p.fsf@thalassa.informatimago.com>:
Moi, ce que j'aimerai savoir, c'est pourquoi tu ne lis pas:
man bash
?
Parce que quitte à utiliser des fonctionnalités non-standard de shells,
autant utiliser celles de zsh, qui sont plus intéressantes.
Moi, ce que j'aimerai savoir, c'est pourquoi tu ne lis pas: man bash ?
Parce que quitte à utiliser des fonctionnalités non-standard de shells, autant utiliser celles de zsh, qui sont plus intéressantes.
ccellier
OK, merci de ces précisions.
J'essaierai de prendre l'habitude d'utiliser printf (qui existe aussi, sans doute, sous de nombreuses variantes qui permettent des choses plus ou moins standard j'imagine...)
OK, merci de ces précisions.
J'essaierai de prendre l'habitude d'utiliser printf (qui existe aussi,
sans doute, sous de nombreuses variantes qui permettent des choses plus
ou moins standard j'imagine...)
J'essaierai de prendre l'habitude d'utiliser printf (qui existe aussi, sans doute, sous de nombreuses variantes qui permettent des choses plus ou moins standard j'imagine...)
Stephane Chazelas
On 28 Feb 2006 12:11:35 GMT, wrote:
OK, merci de ces précisions.
J'essaierai de prendre l'habitude d'utiliser printf (qui existe aussi, sans doute, sous de nombreuses variantes qui permettent des choses plus ou moins standard j'imagine...) [...]
Il y a aussi des problemes.
Mais:
printf '%sn' "$var"
et:
printf %s "$var"
feront toujours ce qu'ils sont censés faire (contrairement a echo "$var" et echo -n "$var").
Il y a des zones pas clair dans la specification, des zones /unspecified/. Mais a l'aide de la specification, on peut ecrire du code portable.
Il y a des bugs de conformance dans certaines implementations mais ca se situe plus au niveau de: printf '351' vs ' 351', des multibyte characters avec %<n>s, de la localisation des nombres, du "--", de printf '%dn' "'A"... et ces bugs sont en general fixés au fur et a mesure qu'ils sont decouverts, ce n'est pas comme pour echo ou il y a deux (voire plus) familles distinctes et incompatibles et pour certaines implementations, aucun moyen d'afficher le contenu d'une variable tel quel (typiquement, avec les echo Unix, pas moyen).
-- Stephane
On 28 Feb 2006 12:11:35 GMT, ccellier@evistel.com wrote:
OK, merci de ces précisions.
J'essaierai de prendre l'habitude d'utiliser printf (qui existe aussi,
sans doute, sous de nombreuses variantes qui permettent des choses plus
ou moins standard j'imagine...)
[...]
Il y a aussi des problemes.
Mais:
printf '%sn' "$var"
et:
printf %s "$var"
feront toujours ce qu'ils sont censés faire (contrairement a
echo "$var" et echo -n "$var").
Il y a des zones pas clair dans la specification, des zones
/unspecified/. Mais a l'aide de la specification, on peut
ecrire du code portable.
Il y a des bugs de conformance dans certaines implementations
mais ca se situe plus au niveau de: printf '351' vs ' 351', des
multibyte characters avec %<n>s, de la localisation des nombres,
du "--", de printf '%dn' "'A"... et ces bugs sont en general
fixés au fur et a mesure qu'ils sont decouverts, ce n'est pas
comme pour echo ou il y a deux (voire plus) familles distinctes
et incompatibles et pour certaines implementations, aucun moyen
d'afficher le contenu d'une variable tel quel (typiquement,
avec les echo Unix, pas moyen).
J'essaierai de prendre l'habitude d'utiliser printf (qui existe aussi, sans doute, sous de nombreuses variantes qui permettent des choses plus ou moins standard j'imagine...) [...]
Il y a aussi des problemes.
Mais:
printf '%sn' "$var"
et:
printf %s "$var"
feront toujours ce qu'ils sont censés faire (contrairement a echo "$var" et echo -n "$var").
Il y a des zones pas clair dans la specification, des zones /unspecified/. Mais a l'aide de la specification, on peut ecrire du code portable.
Il y a des bugs de conformance dans certaines implementations mais ca se situe plus au niveau de: printf '351' vs ' 351', des multibyte characters avec %<n>s, de la localisation des nombres, du "--", de printf '%dn' "'A"... et ces bugs sont en general fixés au fur et a mesure qu'ils sont decouverts, ce n'est pas comme pour echo ou il y a deux (voire plus) familles distinctes et incompatibles et pour certaines implementations, aucun moyen d'afficher le contenu d'une variable tel quel (typiquement, avec les echo Unix, pas moyen).
-- Stephane
Pascal Bourguignon
Stephane Chazelas writes:
Note que ca ne fait pas de sens d'ecrire du code qui marche a la fois en shell bourne-like et en csh-like, ce sont deux familles completement incompatibles.
Pas tant que ça:
------(happy.source)---------------------------------------------------- cat /*dev/null; echo "Happy New Year"! cat <<c*/ /*dev/null | cat > /dev/null c */ () {} /* c */ main() { cat(); printf("Happy New Year!n"); } /* 17 format('Happy New Year!') write (6,17) stop end c*/ ------(Makefile)-------------------------------------------------------- all: happy-c happy-f happy-sh happy-csh
Note que ca ne fait pas de sens d'ecrire du code qui marche a la
fois en shell bourne-like et en csh-like, ce sont deux familles
completement incompatibles.
Pas tant que ça:
------(happy.source)----------------------------------------------------
cat /*dev/null; echo "Happy New Year"!
cat <<c*/ /*dev/null | cat > /dev/null
c */ () {} /*
c */ main() { cat(); printf("Happy New Year!n"); } /*
17 format('Happy New Year!')
write (6,17)
stop
end
c*/
------(Makefile)--------------------------------------------------------
all: happy-c happy-f happy-sh happy-csh
Note que ca ne fait pas de sens d'ecrire du code qui marche a la fois en shell bourne-like et en csh-like, ce sont deux familles completement incompatibles.
Pas tant que ça:
------(happy.source)---------------------------------------------------- cat /*dev/null; echo "Happy New Year"! cat <<c*/ /*dev/null | cat > /dev/null c */ () {} /* c */ main() { cat(); printf("Happy New Year!n"); } /* 17 format('Happy New Year!') write (6,17) stop end c*/ ------(Makefile)-------------------------------------------------------- all: happy-c happy-f happy-sh happy-csh
Moi, ce que j'aimerai savoir, c'est pourquoi tu ne lis pas: man bash ?
Qu'est-ce qui te fait croire que je ne l'ai pas lu ?
Tu aurais trouvé tout seul eval et ${!toto}.
-- __Pascal Bourguignon__ http://www.informatimago.com/ Our enemies are innovative and resourceful, and so are we. They never stop thinking about new ways to harm our country and our people, and neither do we. -- Georges W. Bush
ccellier@evistel.com writes:
On 2006-02-28, Pascal Bourguignon <usenet@informatimago.com> wrote:
Moi, ce que j'aimerai savoir, c'est pourquoi tu ne lis pas:
man bash
?
Qu'est-ce qui te fait croire que je ne l'ai pas lu ?
Tu aurais trouvé tout seul eval et ${!toto}.
--
__Pascal Bourguignon__ http://www.informatimago.com/
Our enemies are innovative and resourceful, and so are we. They never
stop thinking about new ways to harm our country and our people, and
neither do we. -- Georges W. Bush
Moi, ce que j'aimerai savoir, c'est pourquoi tu ne lis pas: man bash ?
Qu'est-ce qui te fait croire que je ne l'ai pas lu ?
Tu aurais trouvé tout seul eval et ${!toto}.
-- __Pascal Bourguignon__ http://www.informatimago.com/ Our enemies are innovative and resourceful, and so are we. They never stop thinking about new ways to harm our country and our people, and neither do we. -- Georges W. Bush