Script semblable à la console
Résolu/Fermé
inkihime
Messages postés
85
Date d'inscription
mardi 4 août 2009
Statut
Membre
Dernière intervention
28 mai 2013
-
5 oct. 2011 à 22:33
mamiemando Messages postés 33611 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 31 mars 2025 - 7 oct. 2011 à 09:33
mamiemando Messages postés 33611 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 31 mars 2025 - 7 oct. 2011 à 09:33
A voir également:
- Script semblable à la console
- Script vidéo youtube - Guide
- Console action - Accueil - Jeu vidéo
- Microsoft activation script - Accueil - Windows
- Ghost script - Télécharger - Polices de caractères
- Site semblable a coco - Accueil - Réseaux sociaux
1 réponse
mamiemando
Messages postés
33611
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
31 mars 2025
7 836
5 oct. 2011 à 22:57
5 oct. 2011 à 22:57
De mémoire, le test "-x" ne sert qu'à vérifier si un fichier est exécutable. Si tu rentres "ls" et que tu n'es pas dans un répertoire qui contient un exécutable "ls", (ou que ce fichier ls n'est pas exécutable) alors le test va répondre faux.
Quelques explications.
Pour évaluer une ligne de commande tu peux utiliser la built-in shell "eval". En fait il y a des cas assez épineux en shell ou les espaces et read ne se comportent pas toujours comme escomptés et c'est là qu'eval sauve la mise.
Le problème c'est que si la commande $cmd saisie est bancale et qu'on se contente d'un simple :
... tu vas voir un truc du genre :
... ce qui est moche. On fait donc une redirection du flux d'erreur standard (2>) vers /dev/null (un trou noir), ce qui revient à ignorer les messages d'erreur renvoyés par eval.
Ensuite, le shell maintient une variable $? qui contient le code de retour associé à la dernière commande shell qui a été lancée. Par convention un programme renvoie 0 quand il se termine bien et une valeur non nulle (appelée code d'erreur) sinon. Typiquement si tu fais un "man ls" tu verras qu'un programme peut avoir différents code d'erreur. L'important dans notre cas est de savoir que par convention, tout programme bien écrit renvoie 0 quand ça se passe bien.
Si tu as eu l'occasion de faire du C ou du C++, le code de retour est renvoyé par la fonction main().
Le echo "command not found" est lui même redirigé. Par défaut echo va écrire dans la sortie standard (/dev/stdout). Mais on vient de voir (avec eval) qu'il était pratique de distinguer quand un message écrit était une sortie du programme (dans ce cas là on l'envoie plutôt vers /dev/stdout) et une erreur (dans ce cas là on l'envoie plutôt dans /dev/stderr).
Note que tu retrouves ces notions de sorties standard dans n'importe quel langage de programmation digne de ce nom (C, C++, java...) avec une syntaxe différente (par exemple pour la sortie standard stdout en C, std::cout en C++, System.out en java etc...). Bref c'est une notion très générale et il est important au même titre que le code de retour de suivre ces conventions.
En shell /dev/stderr se note &2, ce qui donne la redirection >&2. De la même façon /dev/stdout se note &1. Les opérateurs de redirections associés aux sorties standards sont
- pour /dev/stdout : 1> et 1>> (en abrégé > et >>)
- pour /dev/stderr : 2> et 2>>
Ici on aurait donc pu aussi écrire 1>&2.
Enfin, on n'oublie pas le fameux code de retour (exit 1 quand ça plante, exit 0 quand tout va bien).
Bonne chance
#!/bin/sh read cmd eval $cmd 2>/dev/null if [ $? -ne 0 ] then echo "command not found" >&2 exit 1 fi exit 0
Quelques explications.
Pour évaluer une ligne de commande tu peux utiliser la built-in shell "eval". En fait il y a des cas assez épineux en shell ou les espaces et read ne se comportent pas toujours comme escomptés et c'est là qu'eval sauve la mise.
Le problème c'est que si la commande $cmd saisie est bancale et qu'on se contente d'un simple :
eval $cmd
... tu vas voir un truc du genre :
(mando@aldur) (~) $ sh test.sh plop test.sh: 1: eval: plop: not found command not found
... ce qui est moche. On fait donc une redirection du flux d'erreur standard (2>) vers /dev/null (un trou noir), ce qui revient à ignorer les messages d'erreur renvoyés par eval.
Ensuite, le shell maintient une variable $? qui contient le code de retour associé à la dernière commande shell qui a été lancée. Par convention un programme renvoie 0 quand il se termine bien et une valeur non nulle (appelée code d'erreur) sinon. Typiquement si tu fais un "man ls" tu verras qu'un programme peut avoir différents code d'erreur. L'important dans notre cas est de savoir que par convention, tout programme bien écrit renvoie 0 quand ça se passe bien.
Si tu as eu l'occasion de faire du C ou du C++, le code de retour est renvoyé par la fonction main().
Le echo "command not found" est lui même redirigé. Par défaut echo va écrire dans la sortie standard (/dev/stdout). Mais on vient de voir (avec eval) qu'il était pratique de distinguer quand un message écrit était une sortie du programme (dans ce cas là on l'envoie plutôt vers /dev/stdout) et une erreur (dans ce cas là on l'envoie plutôt dans /dev/stderr).
Note que tu retrouves ces notions de sorties standard dans n'importe quel langage de programmation digne de ce nom (C, C++, java...) avec une syntaxe différente (par exemple pour la sortie standard stdout en C, std::cout en C++, System.out en java etc...). Bref c'est une notion très générale et il est important au même titre que le code de retour de suivre ces conventions.
En shell /dev/stderr se note &2, ce qui donne la redirection >&2. De la même façon /dev/stdout se note &1. Les opérateurs de redirections associés aux sorties standards sont
- pour /dev/stdout : 1> et 1>> (en abrégé > et >>)
- pour /dev/stderr : 2> et 2>>
Ici on aurait donc pu aussi écrire 1>&2.
Enfin, on n'oublie pas le fameux code de retour (exit 1 quand ça plante, exit 0 quand tout va bien).
Bonne chance
6 oct. 2011 à 17:20
6 oct. 2011 à 19:16
6 oct. 2011 à 21:58
7 oct. 2011 à 09:33