Rechercher : dans
Par :

[SHELL tcsh]Tester l'existence dune commande

Dernière réponse le 17 jui 2008 à 23:01:36 sebastien, le 29 nov 2005 à 16:37:06 
 Signaler ce message aux modérateurs

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.

Meilleures réponses pour « [SHELL tcsh]Tester l'existence dune commande » dans :
[Shell] Tester une variable numérique Voir Tester une variable numérique    Préambule Dans un environnement "shell", les variables sont, par défaut, de type "chaîne de caractères". De ce fait il n'est pas possible de déclarer une variable de type "entier" (enfin, ceci n'est pas tout à...
Le remplacement de variables en shell Bash Voir=Le remplacement de variables= Introduction Il peut s'avérer utile de s'assurer qu'une variable est bien définie avant de procéder à son remplacement, ou tout simplement de s'assurer que celle-ci n'est pas vide, et dans ce cas de l'initialiser avec...
[Bash] La variable d'environnement PATH VoirLa variable d'environnement PATH I. Préambule II. C'est quoi le shell ? III. Définition IV. Séance de dissection V. Ajouter un répertoire à la variable PATH VI. Et puis... I. Préambule Sous les systèmes GNU/Linux qu'on le veuille ou...
[Shell] Accès aux dernières commandes de l'historique VoirLe shell Linux/Unix regorge de fonctionnalités permettant de gagner du temps. Ainsi, il est possible de remonter dans l'historique des dernières commandes grâce aux flèches de navigation en appuyant sur la flèche du haut. Mais il y a moyen...
Systèmes UNIX - Le shell VoirIntroduction au shell L'interpréteur de commandes est l'interface entre l'utilisateur et le système d'exploitation, d'où son nom anglais «shell», qui signifie «coquille». Le shell est ainsi chargé de faire l'intermédiaire entre le système...
Linux - Le shell VoirIntroduction au shell L'interpréteur de commandes est l'interface entre l'utilisateur et le système d'exploitation, d'où son nom anglais «shell», qui signifie «coquille». Le shell est ainsi chargé de faire l'intermédiaire le système...
Tests et diagnostics du réseau VoirTester la configuration IP Avant toute chose, il est recommandé de véfier la configuration IP de l'ordinateur. Les systèmes Windows proposent un outil en ligne de commande, appelé ipconfig permettant de connaître la configuration IP de...

1

jipicy, le 30 nov 2005 à 10:21:14

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...

;-)) Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé. 

Répondre à jipicy

2

asevere, le 30 nov 2005 à 11:23:13
  • +1

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 :)

Une belette, un lapin !?
C'est pas normal!

Répondre à asevere

3

jipicy, le 30 nov 2005 à 12:05:16

Pffffffffffffffffffffffffffffffffffffff :-[

Bonne journée :)
Toi z'ossi :-) Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé. 

Répondre à jipicy

4

christv31, le 7 jan 2008 à 19:08:50

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!!)

Répondre à christv31

5

dubcek, le 8 jan 2008 à 10:07:31

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 ? :-((((

Répondre à dubcek

6

christv31, le 9 jan 2008 à 20:45:22

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...

Répondre à christv31

7

 Squallynou, le 17 jui 2008 à 14:05:36

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 !)
* la Mort est un réel manque de savoir vivre *
( Linux²  + Apache)  * ( MySQL  x 2 +  PHP² ) * = (Power + Quickness)  / some bad code

Répondre à Squallynou