[SHELL tcsh]Tester l'existence dune commande

Fermé
sebastien - 29 nov. 2005 à 16:37
 anonyme - 10 nov. 2016 à 10:55
Bonjour

Soit un script shell récupérant un argument passé en paramètre.

Cett argument correspond a une commande.


Comment tester si la commande passé en paramètre est :
1- VALIDE?
2- ET EXECUTABLE?



Pour la question 1, jai bien essayé de l executer mais si :
-elle nexiste pas, elle provoque un message d'erreur , ce nest pas tres propre
-si elle existe, la commande sera lancé, pas tres propre aussi

Pour la question 2 (SON EXECUTABILITE) dois je simplement tester les droits en execution? (-x $1) Mais comment faire si la commande lancé est un programme du NOYAU (ls more... sudo ou autre). ya til une distingtion a faire selon que ce soit un programme du répertoire courant ou existant dans le PATH?

Merci davance a tous.

Seb.
A voir également:

5 réponses

Squallynou Messages postés 1 Date d'inscription jeudi 17 juillet 2008 Statut Membre Dernière intervention 17 juillet 2008 5
17 juil. 2008 à 14:05
Bonjour,

Ne surtout pas faire ce que dit Christv31 (qui semble se prendre pour un Dieu de l'informatique, mais plus dans le style du reportage du même nom de "strip tease" pour ceux qui connaissent ^_^)

Voici les raisons pour lesquelles il ne faut pas choisir sa "méthode", même si Sebastien dans son message original donne déjà la réponse :
- Si la commande n'existe pas, le système va générer un message d'erreur. Il est peut être possible de "catcher" cette erreur mais ce n'est pas du tout la bonne manière de tester. Pour faire une analogie parlante, c'est comme si on voulait savoir si une voiture était équipé de frein, et que pour se faire, on la lance à toute vitesse contre un mur et on essaie de freiner 100m avant... Pas top comme test ^_^
- Sinon (la commande existe bien) : elle va être exécutée ! Imaginons que l'on veut savoir si la commande "gnome-open" existe. Soit on fait le test sans argument et ça affiche la ligne "Usage" de la commande (même analogie que tout à l'heure, sauf que les freins sont installés mais vous vous trompez de pédalle), soit ça va l'exécuter et lancer le programme associé au fichier passé en paramêtre... Pas top non plus... Surtout si la commande éteind le PC, efface les fichiers ou autre...


La solution donnée par jipicy fonctionne très bien. exemples :
> which gnome-open
/usr/bin/gnome-open

>which windows
windows: aliased to xvnc4viewer 192.168.1.23:5900


> which rm
rm: aliased to rm -i

>which which
which: shell built-in command

> which commandeInexistante
commandeInexistante not found

Donc il suffit de récupérer le retour de cette commande (dans une variable, dans un fichier etc.)
- Si la réponse commence par "/" c'est que which renvoit la localisation de l'executable de la commande. Il suffit de tester si on a les droits d'execution dessus avec :
test -x /chemin/vers/la/commande

- Si la réponse est équivalente à "#nomdelacommande#: shell built-in command" (exemple : "cd:", "wich:", "exit:" etc.) c'est qu'il s'agit d'une commande directement implémentée par le shell utilisé, donc qui est forcément executable.

- Si la réponse commence par : "#nomdelacommande#: aliased to", il faut la parser pour récupérer ce qui est entre "to " et le prochain espace. Donc pour la réponse "windows: aliased to xvnc4viewer 192.168.1.23:5900", on va récupérer "xvnc4viewer" et on va refaire un which dessus et retraiter ce résultat tant qu'on a ce type de résultat. Ca va donner :
>which xvnc4viewer
/usr/bin/xvnc4viewer


- Sinon : j'ai pas trouvé d'autre cas. N'hésitez pas à compléter :)


Et si quelqu'un a une autre solution, qu'il n'hésite pas à la poster ici afin d'éviter d'avoir des énormités comme celles de Christv31. (et si ce que je viens d'écrire en est une aussi, hésitez encore moins à me corriger !)
5
apt-cache policy "le Nom Du Paquet"
whereis "le Nom Du Paquet"

Mais je n'ai pas encore trouvé une méthode qui me plaise vraiment pour vérifier les dépendances de mes scripts
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
30 nov. 2005 à 10:21
Salut,

Regarde du côté de la comande "which"(man which), elle renvoie le chemin d'accès des commandes :
Which  prend  une  série  de  noms de programmes et affiche les chemins
       d'accès complets que le shell utiliserait pour les exécuter.  Ceci  est
       réalisé  en  simulant  la  recherche  que le shell effectuerait dans la
       variable d'environnement $PATH.
Dommage que ce soit du "tcsh" parce qu'en bash, t'aurais pu t'aider de la commande "type" qui elle renvoie le "type" (en français dans le ton) de la commande, à savoir : interne, alias, fonction ou externe...

;-))
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
30 nov. 2005 à 11:23
Dommage que ce soit du "tcsh" parce qu'en bash, t'aurais pu t'aider de la commande "type" qui elle renvoie le "type" (en français dans le ton) de la commande, à savoir : interne, alias, fonction ou externe...

Ben peut-etre pas is dommage que ça en fait :)
Voire plus simple...
[user@srv01 ~]$ bash
[user@srv01 ~]$ which cd
/usr/bin/which: no cd in (/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/ant-1.6.2/bin:/usr/local/j2sdk1.4.2_03/bin:/usr/local/jonas-3-3-5/bin/unix:/home/gtsadm/bin)
[user@srv01 ~]$ tcsh
[user@srv01 ~]$ which cd
cd: commande intégrée au shell.


Bonne journée :)

0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895 > asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022
30 nov. 2005 à 12:05
pffffffffffffffffffffffffffffffffffffff :-[

Bonne journée :)
Toi z'ossi :-)
0
christv31 Messages postés 21 Date d'inscription jeudi 11 janvier 2007 Statut Membre Dernière intervention 13 août 2015 57
9 janv. 2008 à 20:45
Et bien sur ce qui devait arriver arriva !!!! IL A FALLUT QU'IL LE DISE.

Pour ceux qui ne savent pas encore la commande rm -rf permet détruire tous les répertoires et leur contenu, à partir du répertoire courant (IL LE SAIT LUI!!)

Si on n'est pas à la racine du disque, tant pis, c'est qu'on n'est pas un utilisateur très pertinent !
Sinon si on est connecté en utilisateur ROOT ( ET ALORS LA, ON N'EST PAS PERTINENT DU TOUT, mais IL LE SAIT LUI!!!) on détruit tout le disque. (Il est conseillé de ne pas être connecté en ROOT depuis au moins 2 décennies)

Ceci dit, la question était comment vérifier qu'une commande existe, si on connait les options de la commande rm (-rf), on n'a pas besoin de la tester, puisqu'on le sait. De plus le but est de tester si la commande rm existe, donc les options on les met pas et il ne se passe pas grand chose.

Sinon effectivement sans aller jusqu'à cette extrémité de tester l'existence d'une commande dangereuse, je ne pense pas que ce fut le but de la question d'origine.

Et je ne vais pas continuer cette conversation, car mon but est d'aider certaines personnes, pas de polémiquer avec les autres...
0
c'est longtemps après, mais j'espère que tu t'es abstenu définitivement d'aider qui que ce soit... quel nul!
0
christv31 Messages postés 21 Date d'inscription jeudi 11 janvier 2007 Statut Membre Dernière intervention 13 août 2015 57
7 janv. 2008 à 19:08
Bien que ce sujet soit ancien je vais mettre une réponse qui pourra être utile à d'autres :
Tester si la commande "truc" existe est très simple il faut l'exécuter.
Si elle s'exécute alors elle est vrai au sens logique sinon elle est fausse ce qui peut se traduire en logique par :
si truc alors "faire quelque chose" sinon "faire autre chose"

Ce qui se traduit en langage de shell par :

Home> truc && echo "truc existe" || echo "truc n'existe pas"

echo est la commande pour afficher un chaîne de caractère, ici si truc est une commande alors elle s'exécute et il s'affiche "truc existe" sinon il s'affiche "truc n'existe pas".

Petit complément pour bien comprendre l'astuce :
en shell, && est le ET logique et || est le OU logique.

Si vous vous rappelez votre logique combinatoire appliquée à l'informatique:
A ET B est vrai si A et B sont vrais ensembles et A OU B est vrai si A est vrai ou B est vrai
de plus en informatique :
dans une expression logique avec un OU, si le 1er membre est vrai, le deuxième membre n'est pas évalué
dans une expression logique avec un ET, si le 1er membre est faux, le deuxième membre n'est pas évalué
Ici on cumule les 2 types d'expressions logiques : A ET B OU C

Si le premier membre du OU (=A ET B) est faux, c'est-à-dire truc n'est pas une commande, alors le 2eme membre (=C) est évalué et il s'affiche "truc n'existe pas"
Si le premier membre du ET (=A) est vrai, alors le 2eme membre (=B) est évalué et il s'affiche "truc existe", et comme c'est suivi d'un OU le 2eme membre du OU (=C) n'est pas évaluée donc la 2eme commande echo ne s'exécute pas.

Espérant pour les néophytes avoir été clair (je sais c'est pas évident quand on n'a jamais fait de logique!!)
-1
Lol.
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
8 janv. 2008 à 10:07
Home> truc && echo "truc existe" || echo "truc n'existe pas"
Mais si, dans ce monde de brutes, la commande passée en paramètre est rm -rf ? :-((((
-1