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 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 7 oct. 2011 à 09:33
Bonjour,

Je souhaite créer un script qui effectuerait, en gros, les mêmes actions que la console, soit :
-un message nous proposant de taper une commande
-exécution de la commande tapée
-un message d'erreur si la commande tapée n'existe pas
et ceci en boucle jusqu'au moment ou je quitte le script.
Voici le script que j'ai tapé :
# !/bin/bash
echo "Entrez une commande"
read a
if
test -x $a
then
"$a"
else
echo "Commande introuvable"
fi

/home/utilisateur/nom du script


A chaque fois que je tape une commande, il me dit commande introuvable, la seule qui marche, c'est quand je tape /bin/date, allez savoir pourquoi... Quelqu'un saurait-il me dire où se trouve mon erreur ?
A voir également:

1 réponse

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
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.

#!/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
0
inkihime Messages postés 85 Date d'inscription mardi 4 août 2009 Statut Membre Dernière intervention 28 mai 2013 55
6 oct. 2011 à 17:20
Waw ! J'ai pas tout compris XD Mais merci pour l'explication. Je viens d'entrer dans un IUT réseau et télécom, alors linux est nouveau pour moi. Merci beaucoup, en tout cas, d'avoir pris le temps de m'expliquer.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
6 oct. 2011 à 19:16
As-tu besoin de précisions ou est ce que l'on peut considérer le sujet comme résolu ? Si certains points ne sont pas clairs n'hésite pas.
0
inkihime Messages postés 85 Date d'inscription mardi 4 août 2009 Statut Membre Dernière intervention 28 mai 2013 55
6 oct. 2011 à 21:58
C'est bon tu as répondu à ma question, je voulais juste savoir où se trouvait mon erreur, et je me doutais bien que test était en cause... Mes profs me donneront certainement plus de précision. Merci encore ^^ (Je marque le sujet comme résolu)
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
7 oct. 2011 à 09:33
Parfait, bonne journée !
0