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

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

1 2 3 4 5
Avatar
Nicolas George
Vincent Lefevre wrote in message
<20080526102936$:
Ce n'est pas une question d'être meilleur, c'est une question de
compatibilité. Par exemple, le "file" du vendeur peut fournir une
sortie différente de celui d'un "file" installé par l'utilisateur
(e.g. le "file" classique).


La version installée par l'administrateur peut reconnaître plus fiablement
les types des fichiers.

On parle d'Unix, là, pas de windows : l'administrateur est réputé savoir ce
qu'il fait.

Avatar
Nicolas George
Alain Montfranc wrote in message :
Vous n'avez jamais fait de scipts pour cron ?


Avec un shell qui initialise l'environnement.

Avatar
Vincent Lefevre
Dans l'article ,
Kevin Denis écrit:

Les scripts démarrent par une litanie de définitions, alors que
je me verrais plutôt faire un:
PATH=/bin:/usr/bin:/opt/v5/bin:/usr/v4/bin
et la, je suis sur d'appeler le bon binaire, au lieu de devoir
redéfinir selon le chemin, etc..
Je peux affiner si besoin est avec un
if [ version=5 ] then
PATH=...
else
PATH=...
fi


Pour des scripts que tu écris toi-même et qui ne tourneront que sur
ta machine, c'est peut-être acceptable. Pour un script fourni par un
développeur d'une application qui devra tourner sur une multitude de
plateformes différentes, il en est tout autrement, et en général, il
suffit juste d'ajouter des répertoires en tête du $PATH. Mais ça peut
être plus compliqué si le script cherche à utiliser des ressources
fournies par le système (bibliothèques, Java, etc.) qui ne sont pas
forcément disponibles sans rien faire.

Mais le fait que je voie énormément de script appeler chaque
binaire par leur chemin me fait douter de ma méthode.

En forçant un PATH en début de script au lieu de définir le chemin
complet de chaque binaire, est ce que je risque un problème? Lequel?


Dans certains cas, utiliser le chemin complet (une fois déterminé
au début) peut être plus rapide. C'est ce que font les autotools,
car certains utilitaires sont exécutés très souvent. En effet, si
un utilitaire se situe loin dans le $PATH, ça peut prendre du temps
au shell de le rechercher à chaque fois, surtout s'il y a du NFS.
Certains shells ont un système de cache, mais pas tous (d'autant
plus que le système de cache a ses inconvénients).

--
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 <483a98f0$0$15523$,
Nicolas George <nicolas$ écrit:

Cyrille Lefevre wrote in message
:
au contraire, les applications propres ne polluent pas le système
en se mettant partout.


Ce n'est pas la manière Unix de procéder.


Il n'y a pas de manière Unix de procéder. Il y a juste des problèmes
à résoudre. Et puis Unix a évolué. Ce qui se faisait dans le temps
n'est pas forcément bon de nos jours.

autre pb, le fait de passer par des wrapper permet de contourner
les pbs de compatibilité des bibliothèques entre 2 appli, les lib
ssh par ex.


Il y a les SONAME, pour ça.


Ce n'est pas suffisant. Par exemple, il y a des bibliothèques qui
ont le même nom, mais qui sont incompatibles (je pense à readline,
en particulier). Certaines bibliothèques peuvent aussi être
patchées pour pouvoir fonctionner avec l'application en question.
Il y a aussi le problème de pouvoir installer et utiliser plusieurs
versions (dont des versions de développement) d'une application;
si les applications n'ont pas leur répertoire privé, cela donne
des conflits.

--
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
<20080526111452$:
Par exemple, il y a des bibliothèques qui
ont le même nom, mais qui sont incompatibles


Ce n'est absolument pas normal. Ton système est cassé.

Avatar
Vincent Lefevre
Dans l'article <483a99bf$0$15523$,
Nicolas George <nicolas$ écrit:

Vincent Lefevre wrote in message
<20080526102936$:
Ce n'est pas une question d'être meilleur, c'est une question de
compatibilité. Par exemple, le "file" du vendeur peut fournir une
sortie différente de celui d'un "file" installé par l'utilisateur
(e.g. le "file" classique).


La version installée par l'administrateur peut reconnaître plus
fiablement les types des fichiers.


Attention, libtool est lancé par l'utilisateur qui compile, donc
pas forcément par un "administrateur". Concernant "file", le
problème est que libtool doit parser la sortie, et pour qu'il
puisse la reconnaître, il doit s'assurer d'exécuter un "file"
connu.

Note: "file" est avant tout une commande utilisateur, pas une
commande système. On ne peut donc pas reprocher à l'utilisateur
(ou même administrateur) d'avoir installé une version qu'il juge
meilleure (c'est complètement subjectif) dans son $HOME ou dans
/usr/local/bin.

--
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 <483a99ec$0$15523$,
Nicolas George <nicolas$ écrit:

Alain Montfranc wrote in message :
Vous n'avez jamais fait de scipts pour cron ?


Avec un shell qui initialise l'environnement.


Il n'y a pas forcément un environnement unique qui convienne à tout
le monde.

--
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 <483a9e77$0$31953$,
Nicolas George <nicolas$ écrit:

Vincent Lefevre wrote in message
<20080526111452$:
Par exemple, il y a des bibliothèques qui
ont le même nom, mais qui sont incompatibles


Ce n'est absolument pas normal. Ton système est cassé.


Non. Mac OS X fournit un readline BSD (/usr/lib/libreadline.dylib),
mais l'utilisateur peut préférer le readline GNU (au passage, sous
GPL, pas LGPL, donc pas utilisable avec toutes les applications),
par exemple installé via MacPorts: /opt/local/lib/libreadline.dylib

Même nom, deux bibliothèques incompatibles.

--
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
<20080526113449$:
Non.


Si.

Même nom, deux bibliothèques incompatibles.


Je maintiens : si elles sont incompatibles, qu'elles aient le même nom est
un bug, il n'y a pas d'autre nom.

Que macos x le fasse n'est absolument pas une preuve.

Avatar
Nicolas George
Vincent Lefevre wrote in message
<20080526113210$:
Il n'y a pas forcément un environnement unique qui convienne à tout
le monde.


Il y a presque toujours un environnement qui convienne à la plupart des
scripts lancés sur une machine. Que cet environnement soit dupliqué dans
chacun des scripts est totalement contre-productif et crétin.

1 2 3 4 5