Dans l'article ,
Stephane CHAZELAS écrit:Tous les shells standard Unix ont ce cache et la commande "hash"
qui va avec (c'est une "XSI extension" dans SUSv3).
[...]
ay:~> sh
sh-3.1$ ls foo
ls: cannot access foo: No such file or directory
sh-3.1$ ln -s /bin/true bin/ls
sh-3.1$ ls foo
sh-3.1$ rm bin/ls
sh-3.1$ exit
Dans le premier cas (bash exécuté en tant que bash), le shell ne voit
pas le nouveau ls (dans un répertoire situé avant dans le $PATH) à
cause du cache. Dans le second cas (bash exécuté en tant que sh), le
shell voit le nouveau ls, donc pas de cache.
C'est d'autant plus important que les scripts shell portables
commencent par #!/bin/sh et non #!/bin/bash, et que $SHELL vaut
généralement /bin/sh.
Dans l'article <slrng3lg65.903.stephane.chazelas@spam.is.invalid>,
Stephane CHAZELAS <stephane_chazelas@yahoo.fr> écrit:
Tous les shells standard Unix ont ce cache et la commande "hash"
qui va avec (c'est une "XSI extension" dans SUSv3).
[...]
ay:~> sh
sh-3.1$ ls foo
ls: cannot access foo: No such file or directory
sh-3.1$ ln -s /bin/true bin/ls
sh-3.1$ ls foo
sh-3.1$ rm bin/ls
sh-3.1$ exit
Dans le premier cas (bash exécuté en tant que bash), le shell ne voit
pas le nouveau ls (dans un répertoire situé avant dans le $PATH) à
cause du cache. Dans le second cas (bash exécuté en tant que sh), le
shell voit le nouveau ls, donc pas de cache.
C'est d'autant plus important que les scripts shell portables
commencent par #!/bin/sh et non #!/bin/bash, et que $SHELL vaut
généralement /bin/sh.
Dans l'article ,
Stephane CHAZELAS écrit:Tous les shells standard Unix ont ce cache et la commande "hash"
qui va avec (c'est une "XSI extension" dans SUSv3).
[...]
ay:~> sh
sh-3.1$ ls foo
ls: cannot access foo: No such file or directory
sh-3.1$ ln -s /bin/true bin/ls
sh-3.1$ ls foo
sh-3.1$ rm bin/ls
sh-3.1$ exit
Dans le premier cas (bash exécuté en tant que bash), le shell ne voit
pas le nouveau ls (dans un répertoire situé avant dans le $PATH) à
cause du cache. Dans le second cas (bash exécuté en tant que sh), le
shell voit le nouveau ls, donc pas de cache.
C'est d'autant plus important que les scripts shell portables
commencent par #!/bin/sh et non #!/bin/bash, et que $SHELL vaut
généralement /bin/sh.
Sur un système correctement conçu, ce n'est pas un problème : on peut très
bien compiler un programme avec « -lreadline » et obtenir un binaire qui
dépend ensuite de libeditline.so.42. C'est précisément à ça que sert le
SONAME.
ncurses est binairement compatible avec curses.
Sur un système correctement conçu, ce n'est pas un problème : on peut très
bien compiler un programme avec « -lreadline » et obtenir un binaire qui
dépend ensuite de libeditline.so.42. C'est précisément à ça que sert le
SONAME.
ncurses est binairement compatible avec curses.
Sur un système correctement conçu, ce n'est pas un problème : on peut très
bien compiler un programme avec « -lreadline » et obtenir un binaire qui
dépend ensuite de libeditline.so.42. C'est précisément à ça que sert le
SONAME.
ncurses est binairement compatible avec curses.
Ca ressemble a un bug dans ton sh, a moins que tu n'aies
un SHELLOPTS dans ton environment.
Je n'ai pas ce probleme avec bash 3.2.
Que te dit
strace -f sh -c 'ls;ls' 2>&1 | grep /ls
?
C'est d'autant plus important que les scripts shell portables
commencent par #!/bin/sh et non #!/bin/bash, et que $SHELL vaut
généralement /bin/sh.
Il n'y a aucune guarantie que /bin/sh soit un shell POSIX.
$SHELL, c'est pour que les applications sachent quel shell
interactif l'utilisateur souhaite, donc typiquement, c'est
/bin/zsh ;)
Ca ressemble a un bug dans ton sh, a moins que tu n'aies
un SHELLOPTS dans ton environment.
Je n'ai pas ce probleme avec bash 3.2.
Que te dit
strace -f sh -c 'ls;ls' 2>&1 | grep /ls
?
C'est d'autant plus important que les scripts shell portables
commencent par #!/bin/sh et non #!/bin/bash, et que $SHELL vaut
généralement /bin/sh.
Il n'y a aucune guarantie que /bin/sh soit un shell POSIX.
$SHELL, c'est pour que les applications sachent quel shell
interactif l'utilisateur souhaite, donc typiquement, c'est
/bin/zsh ;)
Ca ressemble a un bug dans ton sh, a moins que tu n'aies
un SHELLOPTS dans ton environment.
Je n'ai pas ce probleme avec bash 3.2.
Que te dit
strace -f sh -c 'ls;ls' 2>&1 | grep /ls
?
C'est d'autant plus important que les scripts shell portables
commencent par #!/bin/sh et non #!/bin/bash, et que $SHELL vaut
généralement /bin/sh.
Il n'y a aucune guarantie que /bin/sh soit un shell POSIX.
$SHELL, c'est pour que les applications sachent quel shell
interactif l'utilisateur souhaite, donc typiquement, c'est
/bin/zsh ;)
Ben justemement, pour que PATH soit correct pour les scripts
des utilisateurs, il faut bien que quelquechose dans le systeme
le definisse. Et c'est en general les init scripts.
Typiquement, le PATH que les cron jobs heritent est le PATH
definit dans /etc/init.d/cron ou un de ses ancetres.
Maintenant, il y a aussi:
- le PATH des utilisateurs normaux,
- le PATH des super-utilisateurs quand ils se logguent
- le PATH de cron
- le PATH de xinetd/inetd
- le PATH par default du systeme
- le PATH de compatibilite avec tel ou tel standard (par
exemple, sous Solaris, faut faire un "getconf PATH" dans le
bon environnement (gueh!?) pour avoir des outils conformes
sinon par defaut on a les outils des 1980s.
C'est pas forcement toujours rose et propre.
Ben justemement, pour que PATH soit correct pour les scripts
des utilisateurs, il faut bien que quelquechose dans le systeme
le definisse. Et c'est en general les init scripts.
Typiquement, le PATH que les cron jobs heritent est le PATH
definit dans /etc/init.d/cron ou un de ses ancetres.
Maintenant, il y a aussi:
- le PATH des utilisateurs normaux,
- le PATH des super-utilisateurs quand ils se logguent
- le PATH de cron
- le PATH de xinetd/inetd
- le PATH par default du systeme
- le PATH de compatibilite avec tel ou tel standard (par
exemple, sous Solaris, faut faire un "getconf PATH" dans le
bon environnement (gueh!?) pour avoir des outils conformes
sinon par defaut on a les outils des 1980s.
C'est pas forcement toujours rose et propre.
Ben justemement, pour que PATH soit correct pour les scripts
des utilisateurs, il faut bien que quelquechose dans le systeme
le definisse. Et c'est en general les init scripts.
Typiquement, le PATH que les cron jobs heritent est le PATH
definit dans /etc/init.d/cron ou un de ses ancetres.
Maintenant, il y a aussi:
- le PATH des utilisateurs normaux,
- le PATH des super-utilisateurs quand ils se logguent
- le PATH de cron
- le PATH de xinetd/inetd
- le PATH par default du systeme
- le PATH de compatibilite avec tel ou tel standard (par
exemple, sous Solaris, faut faire un "getconf PATH" dans le
bon environnement (gueh!?) pour avoir des outils conformes
sinon par defaut on a les outils des 1980s.
C'est pas forcement toujours rose et propre.
Moi j'ai SHELL à zsh, mais comme tu le dis, c'est pour les shells
interactifs essentiellement. Les autotools (par exemple) fixent
typiquement SHELL à /bin/sh dans le Makefile, qui sera utilisé
pour les bouts de shell qui y sont inclus.
De même les scripts
générés utilisent /bin/sh. La fonction system() utilise /bin/sh,
etc. /bin/sh est un peu partout.
[...]
Moi j'ai SHELL à zsh, mais comme tu le dis, c'est pour les shells
interactifs essentiellement. Les autotools (par exemple) fixent
typiquement SHELL à /bin/sh dans le Makefile, qui sera utilisé
pour les bouts de shell qui y sont inclus.
De même les scripts
générés utilisent /bin/sh. La fonction system() utilise /bin/sh,
etc. /bin/sh est un peu partout.
[...]
Moi j'ai SHELL à zsh, mais comme tu le dis, c'est pour les shells
interactifs essentiellement. Les autotools (par exemple) fixent
typiquement SHELL à /bin/sh dans le Makefile, qui sera utilisé
pour les bouts de shell qui y sont inclus.
De même les scripts
générés utilisent /bin/sh. La fonction system() utilise /bin/sh,
etc. /bin/sh est un peu partout.
[...]
2008-05-27, 12:18(+00), Vincent Lefevre:
[...]Moi j'ai SHELL à zsh, mais comme tu le dis, c'est pour les shells
interactifs essentiellement. Les autotools (par exemple) fixent
typiquement SHELL à /bin/sh dans le Makefile, qui sera utilisé
pour les bouts de shell qui y sont inclus.
Ca, c'est autre chose, le $SHELL de make est different du $SHELL
de l'environnement. Typiquement, et POSIX le dit clairement,
l'un et l'autre ne doivent pas deteindre sur each other
(j'arrive pas a trouver la tournure francaise (?)).
De même les scripts
générés utilisent /bin/sh. La fonction system() utilise /bin/sh,
etc. /bin/sh est un peu partout.
[...]
Pas forcement, system() utilise le sh conforme au standard
auquel system() conforme.
Sous Solaris, system() peut appeler /usr/xpg4/bin/sh ou
/usr/xpg6/bin/sh or /bin/sh suivant les options de compilation. Sur
un systeme POSIX, system() utilisera un sh POSIX, generalement
/bin/sh.
2008-05-27, 12:18(+00), Vincent Lefevre:
[...]
Moi j'ai SHELL à zsh, mais comme tu le dis, c'est pour les shells
interactifs essentiellement. Les autotools (par exemple) fixent
typiquement SHELL à /bin/sh dans le Makefile, qui sera utilisé
pour les bouts de shell qui y sont inclus.
Ca, c'est autre chose, le $SHELL de make est different du $SHELL
de l'environnement. Typiquement, et POSIX le dit clairement,
l'un et l'autre ne doivent pas deteindre sur each other
(j'arrive pas a trouver la tournure francaise (?)).
De même les scripts
générés utilisent /bin/sh. La fonction system() utilise /bin/sh,
etc. /bin/sh est un peu partout.
[...]
Pas forcement, system() utilise le sh conforme au standard
auquel system() conforme.
Sous Solaris, system() peut appeler /usr/xpg4/bin/sh ou
/usr/xpg6/bin/sh or /bin/sh suivant les options de compilation. Sur
un systeme POSIX, system() utilisera un sh POSIX, generalement
/bin/sh.
2008-05-27, 12:18(+00), Vincent Lefevre:
[...]Moi j'ai SHELL à zsh, mais comme tu le dis, c'est pour les shells
interactifs essentiellement. Les autotools (par exemple) fixent
typiquement SHELL à /bin/sh dans le Makefile, qui sera utilisé
pour les bouts de shell qui y sont inclus.
Ca, c'est autre chose, le $SHELL de make est different du $SHELL
de l'environnement. Typiquement, et POSIX le dit clairement,
l'un et l'autre ne doivent pas deteindre sur each other
(j'arrive pas a trouver la tournure francaise (?)).
De même les scripts
générés utilisent /bin/sh. La fonction system() utilise /bin/sh,
etc. /bin/sh est un peu partout.
[...]
Pas forcement, system() utilise le sh conforme au standard
auquel system() conforme.
Sous Solaris, system() peut appeler /usr/xpg4/bin/sh ou
/usr/xpg6/bin/sh or /bin/sh suivant les options de compilation. Sur
un systeme POSIX, system() utilisera un sh POSIX, generalement
/bin/sh.
En fait, sous Mac OS X, le problème se pose essentiellement au niveau
de la compilation (le chemin complet de la bibliothèque se trouve dans
l'exécutable).
Mais pour compiler, on est bien obligé de spécifier le
chemin vers la bonne bibliothèque.
par exemple, suivant qu'on veuille utiliser une version avec
débuggage mais lente ou une version rapide.
Sous les systèmes où curses = ncurses, oui. Sur les autres (e.g. Solaris),
pas forcément.
En fait, sous Mac OS X, le problème se pose essentiellement au niveau
de la compilation (le chemin complet de la bibliothèque se trouve dans
l'exécutable).
Mais pour compiler, on est bien obligé de spécifier le
chemin vers la bonne bibliothèque.
par exemple, suivant qu'on veuille utiliser une version avec
débuggage mais lente ou une version rapide.
Sous les systèmes où curses = ncurses, oui. Sur les autres (e.g. Solaris),
pas forcément.
En fait, sous Mac OS X, le problème se pose essentiellement au niveau
de la compilation (le chemin complet de la bibliothèque se trouve dans
l'exécutable).
Mais pour compiler, on est bien obligé de spécifier le
chemin vers la bonne bibliothèque.
par exemple, suivant qu'on veuille utiliser une version avec
débuggage mais lente ou une version rapide.
Sous les systèmes où curses = ncurses, oui. Sur les autres (e.g. Solaris),
pas forcément.
Vincent Lefevre wrote in message
<20080527114229$:En fait, sous Mac OS X, le problème se pose essentiellement au niveau
de la compilation (le chemin complet de la bibliothèque se trouve dans
l'exécutable).
Ça m'a l'air assez grotesque, ce truc.
Plus j'entends parler de macos x, moins j'ai envie de l'utiliser.Mais pour compiler, on est bien obligé de spécifier le
chemin vers la bonne bibliothèque.
Compiler est une opération technique et relativement exceptionnelle,
et à ce titre peut tout à fait nécessiter des ajustements.
par exemple, suivant qu'on veuille utiliser une version avec
débuggage mais lente ou une version rapide.
Pareil : débugger, c'est une opération relativement exceptionnelle.
Sous les systèmes où curses = ncurses, oui. Sur les autres (e.g. Solaris),
pas forcément.
Je crois bien que si : ncurses fournit la même ABI que la vielle libtermcap.
Si ce n'était pas le cas, le lien symbolique serait nuisible.
Vincent Lefevre wrote in message
<20080527114229$62cd@prunille.vinc17.org>:
En fait, sous Mac OS X, le problème se pose essentiellement au niveau
de la compilation (le chemin complet de la bibliothèque se trouve dans
l'exécutable).
Ça m'a l'air assez grotesque, ce truc.
Plus j'entends parler de macos x, moins j'ai envie de l'utiliser.
Mais pour compiler, on est bien obligé de spécifier le
chemin vers la bonne bibliothèque.
Compiler est une opération technique et relativement exceptionnelle,
et à ce titre peut tout à fait nécessiter des ajustements.
par exemple, suivant qu'on veuille utiliser une version avec
débuggage mais lente ou une version rapide.
Pareil : débugger, c'est une opération relativement exceptionnelle.
Sous les systèmes où curses = ncurses, oui. Sur les autres (e.g. Solaris),
pas forcément.
Je crois bien que si : ncurses fournit la même ABI que la vielle libtermcap.
Si ce n'était pas le cas, le lien symbolique serait nuisible.
Vincent Lefevre wrote in message
<20080527114229$:En fait, sous Mac OS X, le problème se pose essentiellement au niveau
de la compilation (le chemin complet de la bibliothèque se trouve dans
l'exécutable).
Ça m'a l'air assez grotesque, ce truc.
Plus j'entends parler de macos x, moins j'ai envie de l'utiliser.Mais pour compiler, on est bien obligé de spécifier le
chemin vers la bonne bibliothèque.
Compiler est une opération technique et relativement exceptionnelle,
et à ce titre peut tout à fait nécessiter des ajustements.
par exemple, suivant qu'on veuille utiliser une version avec
débuggage mais lente ou une version rapide.
Pareil : débugger, c'est une opération relativement exceptionnelle.
Sous les systèmes où curses = ncurses, oui. Sur les autres (e.g. Solaris),
pas forcément.
Je crois bien que si : ncurses fournit la même ABI que la vielle libtermcap.
Si ce n'était pas le cas, le lien symbolique serait nuisible.
Cela a ses avantages (e.g. pas besoin de LD_LIBRARY_PATH),
C'est AMHA plus propre que sous
Linux.
Ce n'est pas seulement pour du débuggage "actif". On peut vouloir
utiliser une version d'une bibliothèque qui contient une vérification
complète des assertions, par mesure de sécurité.
Cela a ses avantages (e.g. pas besoin de LD_LIBRARY_PATH),
C'est AMHA plus propre que sous
Linux.
Ce n'est pas seulement pour du débuggage "actif". On peut vouloir
utiliser une version d'une bibliothèque qui contient une vérification
complète des assertions, par mesure de sécurité.
Cela a ses avantages (e.g. pas besoin de LD_LIBRARY_PATH),
C'est AMHA plus propre que sous
Linux.
Ce n'est pas seulement pour du débuggage "actif". On peut vouloir
utiliser une version d'une bibliothèque qui contient une vérification
complète des assertions, par mesure de sécurité.
Cela a ses avantages (e.g. pas besoin de LD_LIBRARY_PATH),
Un Unix moderne correctement configuré n'a pas besoin de LD_LIBRARY_PATH, à
la base.
Pas dans tous les cas de figure. C'est souvent très utile quand
Ce n'est pas seulement pour du débuggage "actif". On peut vouloir
utiliser une version d'une bibliothèque qui contient une vérification
complète des assertions, par mesure de sécurité.
Ça reste quand même quelque chose d'extrêmement particulier.
Cela a ses avantages (e.g. pas besoin de LD_LIBRARY_PATH),
Un Unix moderne correctement configuré n'a pas besoin de LD_LIBRARY_PATH, à
la base.
Pas dans tous les cas de figure. C'est souvent très utile quand
Ce n'est pas seulement pour du débuggage "actif". On peut vouloir
utiliser une version d'une bibliothèque qui contient une vérification
complète des assertions, par mesure de sécurité.
Ça reste quand même quelque chose d'extrêmement particulier.
Cela a ses avantages (e.g. pas besoin de LD_LIBRARY_PATH),
Un Unix moderne correctement configuré n'a pas besoin de LD_LIBRARY_PATH, à
la base.
Pas dans tous les cas de figure. C'est souvent très utile quand
Ce n'est pas seulement pour du débuggage "actif". On peut vouloir
utiliser une version d'une bibliothèque qui contient une vérification
complète des assertions, par mesure de sécurité.
Ça reste quand même quelque chose d'extrêmement particulier.