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

Action sur présence ou non d'un binaire dans le PATH

15 réponses
Avatar
Kevin Denis
Bonjour,

je dois lancer un script sur plusieurs machines.
Selon les machines, j'ai a disposition ou pas certains binaires.
J'utilise le PATH pour vérifier la présence du binaire.
Cela donne:
if [ `which programme` ]
then
echo programme est là
(...)
else
echo programme n'est pas là
(...)
fi

Pour éviter des sorties sur l'écran me montrant la
localisation de 'programme' ou des messages d'erreur comme quoi 'programme'
n'est nulle part, j'ai du modifier le test par:
if [ `which programme 2>\&1 > /dev/null` ]

Pourquoi dois-je mettre un \ devant le & ? Normalement,
tout ce qui est entre `` doit être exécuté tel quel?

Ca me parait lourd comme méthode, existe t'il une manière de réaliser
mon test?

--
Kevin

10 réponses

1 2
Avatar
Stephane CHAZELAS
2008-06-19, 07:59(+00), Kevin Denis:
[...]
Pour éviter des sorties sur l'écran me montrant la
localisation de 'programme' ou des messages d'erreur comme quoi 'programme'
n'est nulle part, j'ai du modifier le test par:
if [ `which programme 2>&1 > /dev/null` ]

Pourquoi dois-je mettre un devant le & ? Normalement,
tout ce qui est entre `` doit être exécuté tel quel?



Le & ne devrait pas etre necessaire. Que ce passe-t-il si tu
l'ommets?

Ca me parait lourd comme méthode, existe t'il une manière de réaliser
mon test?



C'est lourd et incorrect.

Essaie

if command -v programme > /dev/null 2>&1; then
...

ou

exists() {
command -v -- "$1" > /dev/null 2>&1
}

if exists programme; then
...

Tu as aussi la commande "type". which n'est pas une commande
standard et son comportement varie d'une implementation a
l'autre.

--
Stéphane
Avatar
Kevin Denis
Le 19-06-2008, Stephane CHAZELAS a écrit :
Pour éviter des sorties sur l'écran me montrant la
localisation de 'programme' ou des messages d'erreur comme quoi 'programme'
n'est nulle part, j'ai du modifier le test par:
if [ `which programme 2>&1 > /dev/null` ]

Pourquoi dois-je mettre un devant le & ? Normalement,
tout ce qui est entre `` doit être exécuté tel quel?



Le & ne devrait pas etre necessaire.



L'habitude d'utiliser 2>&1 > peut-etre? Mais la, je ne comprends plus:
$ [ `which ls 2>&1 > /dev/null` ] && echo present
$
$ which ls
/bin/ls

???

Que ce passe-t-il si tu l'ommets?



$ [ `which ls 2> 1> /dev/null` ] && echo present
-bash: command substitution: line 1: syntax error near unexpected token `1'

Ca me parait lourd comme méthode, existe t'il une manière de réaliser
mon test?



C'est lourd et incorrect.

Essaie

if command -v programme > /dev/null 2>&1; then
...



parfait, c'est de plus très lisible, merci

ou

exists() {
command -v -- "$1" > /dev/null 2>&1
}

if exists programme; then
...



effectivement, je garde ça sous le coude.

Tu as aussi la commande "type". which n'est pas une commande
standard et son comportement varie d'une implementation a
l'autre.



Ok.
--
Kevin
Avatar
Stephane CHAZELAS
2008-06-19, 09:28(+00), Kevin Denis:
[...]
if [ `which programme 2>&1 > /dev/null` ]

Pourquoi dois-je mettre un devant le & ? Normalement,
tout ce qui est entre `` doit être exécuté tel quel?



Le & ne devrait pas etre necessaire.





Oups, je voulais dire: le n'est pas necessaire.

L'habitude d'utiliser 2>&1 > peut-etre? Mais la, je ne comprends plus:
$ [ `which ls 2>&1 > /dev/null` ] && echo present
$
$ which ls
/bin/ls



Si tu veux rediriger stdout et stderr vers /dev/null, c'est

/dev/null 2>&1



2>&1 > /dev/null

Ca redirige stderr vers le fichier "&1" et stdout vers /dev/null

Donc `which...` expands to nothing. Donc [...] est false.

2>&1 > /dev/null

ca redirige stderr vers ce sur quoi pointait stdout et stdout
vers /dev/null

Je crois que ce que tu voulais dire est:

[ -n "$(which ls 2> /dev/null)" ]

Attention aux a l'interieur des `...`. Utilise $(...) plutot.
Quoique dans ce cas utiliser l'un comme l'autre est incorrect.


--
Stéphane
Avatar
Cyrille Lefevre
Kevin Denis a écrit :
[snip]
Pour éviter des sorties sur l'écran me montrant la
localisation de 'programme' ou des messages d'erreur comme quoi 'progra mme'
n'est nulle part, j'ai du modifier le test par:
if [ `which programme 2>&1 > /dev/null` ]

Pourquoi dois-je mettre un devant le & ? Normalement,
tout ce qui est entre `` doit être exécuté tel quel?



Bonjour,

les ` sont "deprecated", utilise plutôt $(...) à la place, auquel cas tu
n'as pas besoin de protéger ladit expression, ce qui donne :

[ $(which progname > /dev/null 2>&1) ]

PS : l'ordre des redirections est important. 2>&1 > /dev/null
n'as pas du tout le même effet que > /dev/null 2>&1.

PS bis: pourquoi ne pas tester le code retour de which (ou type qui est
bien plus portable) ? ex. :
if type programme > /dev/null 2>&1

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Avatar
Olivier Miakinen
Le 20/06/2008 10:25, Cyrille Lefevre a écrit :

les ` sont "deprecated", utilise plutôt $(...) à la place



Ah zut, encore une mauvaise habitude dont je vais avoir à me défaire.
Est-ce que tu sais pourquoi ils le sont ?
Avatar
Matthieu Moy
Cyrille Lefevre <cyrille.lefevre-news%
writes:

which (ou type qui est bien plus portable)



Il parait que « command » (ou « command -v ») est le plus portable.

--
Matthieu
Avatar
Stephane CHAZELAS
2008-06-20, 20:25(+02), Matthieu Moy:
Cyrille Lefevre <cyrille.lefevre-news%
writes:

which (ou type qui est bien plus portable)



Il parait que « command » (ou « command -v ») est le plus portable.



type est plus portable je pense. type n'est pas POSIX mais est
UNIX. command -v est POSIX mais est optionnel chez POSIX
(required chez UNIX).

On trouve des "type" dans certains Bourne shells, mais il n'y a
pas de "command" dans le Bourne shell (note qu'il n'y a pas de
$(...)) non plus.

Parmis les POSIX shells, il n'y a guere que "posh" qui n'ait pas
type ou n'ait pas "command -v"

--
Stéphane
Avatar
Cyrille Lefevre
Olivier Miakinen a écrit :
Le 20/06/2008 10:25, Cyrille Lefevre a écrit :
les ` sont "deprecated", utilise plutôt $(...) à la place



Ah zut, encore une mauvaise habitude dont je vais avoir à me défair e.
Est-ce que tu sais pourquoi ils le sont ?




Bonjour,

s/deprecaded/déconseillée/ :)

pour les raisons que j'ai avancée :

par exemple :

echo `echo `echo `echo coucou```

donne :

echo $(echo $(echo $(echo coucou)))

quelle notation te semble la plus lisible ?

PS : deprecaded == déprécié en français dans le texte...
mais je ne m'en souvenait plus lors de la rédaction !

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Avatar
Cyrille Lefevre
Matthieu Moy a écrit :
Cyrille Lefevre <cyrille.lefevre-news%
writes:

which (ou type qui est bien plus portable)



Il parait que « command » (ou « command -v ») est le plus porta ble.




Bonjour,

reprenons au début, il était une fois, SystemV vs. BSD, etc.

sysv => bourne shell => type (builtin)
bsd => csh => which (script csh)

pour autant, on trouve aussi le bourne shell sous bsd, mais pas
nécessairement l'inverse -- je parle toujours des origines --

depuis, nous avons toujours eu un équivalent, sous la forme d'un alias
sur whence -v en ksh par ex. d'après posix, ce serait l'équivalent à
command -V, -v ne retournant que le chemin de l'argument, alors que
type retourne aussi le type de l'argument (builtin, alias, etc.).
à ce propos, posix (susv3) documente la commande type...

bref, type à toujours existé, et existera surement toujours.

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Avatar
Stephane CHAZELAS
2008-06-22, 03:23(+02), Cyrille Lefevre:
[...]
depuis, nous avons toujours eu un équivalent, sous la forme d'un alias
sur whence -v en ksh par ex. d'après posix, ce serait l'équivalent à
command -V, -v ne retournant que le chemin de l'argument, alors que
type retourne aussi le type de l'argument (builtin, alias, etc.).
à ce propos, posix (susv3) documente la commande type...



Note que "type" n'est pas POSIX, seulement Unix (XSI extension
dans SUSv3). "command -v" est POSIX mais est optionel. C'est
pour ca que par exemple "posh" n'a ni l'un ni l'autre.

bref, type à toujours existé, et existera surement toujours.



Non, "type" n'est pas dans tous les Bourne shells (a ete ajoute
dans SVR2 (1984) et son exit status n'a pas toujours permis
de savoir si la commande existait ou non, il fallait parser le
resultat pour "not found"). Il me semble, mais je peux me
tromper qu'il n'etait pas dans les premiers ksh88 non plus.

Parmis les shells POSIX, je ne connais que "posh" qui ne l'ait
pas. Il y a un bug report a ce sujet. Pas que ce soit un bug,
mais n'avoir ni "command -v" ni "type" fait qu'il manque une
fonctionnalité essentielle a ce shell.

LSB (le /standard/ Linux) n'a ni type, ni command (pourtant
POSIX, seules -v et -V sont optionnels), ni which, ni whence, ni
where.

--
Stéphane
1 2