OVH Cloud OVH Cloud

variable PATH dans des scripts

94 réponses
Avatar
Kevin Denis
Bonjour,

je suis en train de mettre à jour différents scripts afin de les
adapter à différents environnements.

De manière générale (et c'est une question plus large), je vois
souvent des scripts démarrer par une définition des binaires utilisés,
comme par exemple:
#! /bin/sh
LS=/bin/ls
WC=/usr/bin/wc
echo le nombre de fichier est `LS|WC`

Ma première question est la suivante, pourquoi utiliser une définition
littérale alors que l'on peut utiliser PATH?
#! /bin/sh
PATH=/bin:/usr/bin
echo le nombre de fichier est `ls|wc`

Ma seconde question, plus spécifique à mon cas, puisque selon
l'architecture les binaires sont dans des lieux différents:
Mieux vaut il faire
#! /bin/sh
PATH=/opt/bin:/bin etc..

ou bien:
#! /bin/sh
if [ test archi ] then
LS=/bin/ls
else
LS=/opt/bin/ls
fi

etc..

Merci.
--
Kevin

10 réponses

Avatar
Marc
Vincent Lefevre wrote:

Mettre les home des utilisateurs dans le ld.so.conf serait un très
gros trou de sécurité.


Sous solaris (qui comme linux et freebsd utilise elf) on peut faire
utiliser un (équivalent de) ld.so.conf différent par exécutable, et
overrider ce choix par une variable d'environnement.

Ça ne résout pas le problème où on peut se retrouver avec des timeout
NFS.


Si on veut tout casser, on y arrivera toujours.

Au final, je trouve le mécanisme ELF infiniment supérieur à ce que
tu décris du mécanisme mach-0.


Dès qu'on est un utilisateur sérieux, ELF présente ses limites.


Je n'ai pas encore vu décrire dans ce thread la moindre limitation du
format ELF, juste une préférence contre une certaine façon de l'utiliser
jugée classique par certains sous linux.

Bon je crois qu'on ne sera jamais d'accord...


Avatar
Nicolas George
Vincent Lefevre wrote in message
<20080530015535$:
C'est ça ou le LD_LIBRARY_PATH.


Non. D'ailleurs, tu donnes toi-même la solution ensuite.

Non il ne sait pas dès qu'il y a des bibliothèques installées dans
le home de l'utilisateur (ce qui est très souvent le cas).


C'est au contraire assez rare avec une utilisation commune d'un Unix, à
savoir un administrateur qui administre et des utilisateurs qui utilisent,
et pas le contraire.

Avatar
Nicolas George
Vincent Lefevre wrote in message
<20080530020839$:
Non, ce n'est pas rare. Dès qu'on est dans un labo avec un réseau de
machines et qu'on veut installer telle ou telle bibliothèque pour soi,
on est bien obligé de l'installer quelque part dans son home.


L'utilisation normale serait de demander à l'administrateur de l'installer.

Avatar
mpg
Le (on) vendredi 30 mai 2008 19:31, Nicolas George a écrit (wrote) :

Vincent Lefevre wrote in message
<20080530020839$:
Non, ce n'est pas rare. Dès qu'on est dans un labo avec un réseau de
machines et qu'on veut installer telle ou telle bibliothèque pour soi,
on est bien obligé de l'installer quelque part dans son home.


L'utilisation normale serait de demander à l'administrateur de
l'installer.


Ça dépend de ta définition de normal. Après, moi j'aime me préoccuper de la
réalité, plus que de la normalité, mais c'est une question de goût :-)

Manuel.


Avatar
Vincent Lefevre
Dans l'article <48403988$0$19312$,
Nicolas George <nicolas$ écrit:

Vincent Lefevre wrote in message
<20080530015535$:
C'est ça ou le LD_LIBRARY_PATH.


Non. D'ailleurs, tu donnes toi-même la solution ensuite.


Quelle solution? Il faut bien que le chemin soit indiqué quelque part.
Si ce n'est pas dans l'exécutable (directement ou indirectement), ça
ne peut être que dans une variable d'environnement.

Non il ne sait pas dès qu'il y a des bibliothèques installées dans
le home de l'utilisateur (ce qui est très souvent le cas).


C'est au contraire assez rare avec une utilisation commune d'un
Unix, à savoir un administrateur qui administre et des utilisateurs
qui utilisent, et pas le contraire.


Non, ce n'est pas rare. Visiblement tu n'y connais rien.
L'administrateur ne peut en général pas s'occuper des besoins
spécifiques des utilisateurs (ou si ceux-ci développent leur
propre bibliothèque). Il n'y a qu'à voir le nombre de messages
dans les liste de discussions concernant les chemins mal
configurés...

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)


Avatar
Vincent Lefevre
Dans l'article <g1os10$24n9$,
Marc écrit:

Vincent Lefevre wrote:

On peut aussi faire ça en ELF si on veut. C'est même ce qui se produit
par défaut quand on lie avec une bibliothèque en donnant son chemin
complet si elle n'a pas de soname, je crois.


Mais ce n'est pas ce qui se passe quand on faire un configure, make,
make install (le truc relativement standard, quoi).


Parce que ce n'est pas la meilleure solution.


Mais c'est celle recommandée et qui est utilisée généralement.

Avec les plus courants: autotools et gcc.


Les autotools sont beaucoup décriés, un certain nombre de projets s'en
écartent.


Oui, mais ce sont les plus utilisés. Et c'est le système le plus
pratique actuellement pour les développeurs.

Mais j'ai déjà installé des projets utilisant les autotools qui
mettaient un rpath correct.


Je suis intéressé de savoir. Lesquels?

J'en ai même vu qui refaisaient le link entre le make check et le
make install parce que le rpath à utiliser n'était pas le même dans
les deux cas.


Le "make check" des bibliothèques (utilisation de libtool) fait déjà
un certain nombre de bidouilles (qui ne marchent pas partout) pour
linker avec la bibliothèque compilée au lieu de la bibliothèque
éventuellement installée (e.g. précédente version).

A noter que gcc est assez pénible à ne pas fournir par défaut des
specs qui ajoutent au rpath l'emplacement de la libgcc_s.


Oui.

On peut utiliser des chemins relatifs dans un rpath avec $ORIGIN.


Mais il y a toujours la base du chemin à configurer quelque part.


Ben non, la base du chemin c'est $ORIGIN, ie la position de l'objet dans
lequel est indiqué ce rpath. Le seul gag possible c'est le hardlink.


Mais cette position, il faut bien l'indiquer quelque part.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)



Avatar
Vincent Lefevre
Dans l'article <484039d8$0$19312$,
Nicolas George <nicolas$ écrit:

Vincent Lefevre wrote in message
<20080530020839$:
Non, ce n'est pas rare. Dès qu'on est dans un labo avec un réseau de
machines et qu'on veut installer telle ou telle bibliothèque pour soi,
on est bien obligé de l'installer quelque part dans son home.


L'utilisation normale serait de demander à l'administrateur de l'installer.


N'importe quoi.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)


Avatar
Nicolas George
Vincent Lefevre wrote in message
<20080531081559$:
Mais c'est celle recommandée et qui est utilisée généralement.


Recommandée par qui ?

Mais cette position, il faut bien l'indiquer quelque part.


Je crois que tu n'as pas bien compris la sémantique de $ORIGIN. Relis le
message de Marc plus attentivement.

Avatar
Vincent Lefevre
Dans l'article <48413382$0$31892$,
Nicolas George <nicolas$ écrit:

Vincent Lefevre wrote in message
<20080531081559$:
Mais c'est celle recommandée et qui est utilisée généralement.


Recommandée par qui ?


Par les développeurs des logiciels en question. Il y a généralement
un fichier INSTALL qui indique: configure, make, make install, avec
éventuellement des options pour configure (cf configure --help). Il
y a d'ailleurs un fichier INSTALL type qui est distribué avec les
autotools (et utilisé quand on fait un autoreconf et que le fichier
INSTALL est initialement absent). Tu noteras aussi qu'il n'y est
fait aucune mention du run path.

Mais cette position, il faut bien l'indiquer quelque part.


Je crois que tu n'as pas bien compris la sémantique de $ORIGIN.
Relis le message de Marc plus attentivement.


Le message de Marc n'est pas suffisamment clair. C'est quelque chose
qui n'est mentionné nulle part dans les outils de développements,
enfin juste dans la doc de ld sous Linux, mais aucune explication
du fonctionnement, et il a l'air de désigner autre chose: une adresse
mémoire (si c'est bien la fonctionnalité dont tu parles, comment cela
résout-il le problème des chemins?).

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)


Avatar
Nicolas George
Vincent Lefevre wrote in message
<20080531152017$:
Par les développeurs des logiciels en question. Il y a généralement
un fichier INSTALL qui indique: configure, make, make install, avec
éventuellement des options pour configure (cf configure --help).


Les fichiers INSTALL décrivent la procédure d'installation dans des
conditions normales, donc en particulier où les bibliothèques requises sont
installées dans les répertoires standards. Si tu veux faire quelque chose de
plus baroque avec ton système, tu en as le droit, mais tu es censé savoir
comment faire.