A voir également:
- [SHELL tcsh]Tester l'existence dune commande
- Invite de commande - Guide
- Flash drive tester - Télécharger - Divers Utilitaires
- Tester son pc - Guide
- Commande terminal mac - Guide
- Classic shell windows 11 - Télécharger - Personnalisation
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
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 !)
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 !)
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
30 nov. 2005 à 10:21
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 :
;-))
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...
;-))
asevere
Messages postés
13084
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
23 novembre 2024
426
30 nov. 2005 à 11:23
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...
Bonne journée :)
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 :)
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
>
asevere
Messages postés
13084
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
23 novembre 2024
30 nov. 2005 à 12:05
30 nov. 2005 à 12:05
pffffffffffffffffffffffffffffffffffffff :-[
Bonne journée :)
Toi z'ossi :-)
Bonne journée :)
Toi z'ossi :-)
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
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...
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...
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
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!!)
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!!)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
dubcek
Messages postés
18758
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
24 décembre 2024
5 623
8 janv. 2008 à 10:07
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 ? :-((((
Mais si, dans ce monde de brutes, la commande passée en paramètre est rm -rf ? :-((((
Modifié par anonyme le 10/11/2016 à 11:37
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