logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 04-09-2017 09:55:11

Philou
Membre
Distrib. : Debian 10
Noyau : Linux 4.19.0-5-amd64
Inscription : 03-09-2017

Appel de sous-programmes

Bonjour,
J’ai créé dans un programme « toto »  une fonction nommée « couleur » qui me permet de colorer mes affichages.

Afin de ne pas l’installer systématiquement au début de tous mes programmes j’ai essayé un
./toto
couleur blabla…

Mais là j’obtiens le message d’erreur suivant : couleur commande inconnue.
Si vous pouviez m’aider, merci.

Hors ligne

#2 04-09-2017 10:14:24

Severian
Membre
Distrib. : Debian GNU/Linux 9.4 (stretch)
Noyau : Linux 4.14.0-0.bpo.3-amd64
(G)UI : Openbox 3.6.1-4
Inscription : 13-12-2014

Re : Appel de sous-programmes

Philou a écrit :

Bonjour,
J’ai créé dans un programme « toto »  une fonction nommée « couleur » qui me permet de colorer mes affichages.


bonjour
le programme toto est en bash, python, c++, ... ??
colorer tes affichages ? de console, d'affiche, de fenêtres, de bureau ...?

bref si tu en disais un peu plus, si tu nous montrais le script toto, ça sera peut être plus facil pour ceux qui ont des notions de programmation smile

Dernière modification par Severian (04-09-2017 10:14:37)

Hors ligne

#3 04-09-2017 15:10:50

Lancelot du Lac
Membre
Lieu : France
Distrib. : Jessie | Stretch
Noyau : Linux 3.16.0-4-amd64 | 4.5.0-1-amd64
(G)UI : ZSH / LXDE, Openbox | KDE
Inscription : 22-02-2016

Re : Appel de sous-programmes

Je rejoins Severian. Il nous faut au moins le langage utilisé et a minima quelques morceaux de code pour pouvoir t'aider.

Cela dit, voici quelques éléments :
Si couleur est considérée comme une commande inconnue, c'est sans doute une fonction d'un interpréteur de shell (bash sans doute).
Où la fonction 'couleur' a-t-elle été déclarée ? Dans un fichier, dans la ligne de commandes ?
Pour que 'toto' puisse accéder à cette fonction, il faut qu'elle ait été déclarée d'une manière ou d'une autre dans le même processus, ou un processus parent, sinon 'toto' ne peut pas l'utiliser.

Dell Inspiron 7500 series - Debian Stretch - KDE/openbox - ZSH
Samsung - Debian Jessie - LXDE/pas de graphique - ZSH

Hors ligne

#4 05-09-2017 07:01:42

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : Appel de sous-programmes

En supposant que soit du shell, quand tu fais :


./toto
 


l'ensemble des commandes du fichier toto est évalué dans un
nouveau shell. Ce shell prend fin quand il a exécuté l'ensemble des
commandes dans le fichier toto. Et donc la fonction
couleur n'est pas définie dans le shell courant.

 .
toto

permet de « sourcer » le fichier toto dans lequel
tu as définit ta fonction couleur.

Ce qu'il faut c'est évalué le script (toto) dans le shell courant avec :


. toto
 


Ou en bash :


source toto
 

Hors ligne

#5 05-09-2017 16:46:15

Philou
Membre
Distrib. : Debian 10
Noyau : Linux 4.19.0-5-amd64
Inscription : 03-09-2017

Re : Appel de sous-programmes

Bonjour, voici rapidement mes deux programmes :

COULEUR :

#!/bin/bash
rouge="\033[34m"
Reset="\033[0m"
cecho ()     
{
message=$1
color=$2
echo "$color$message$Reset"
return
}
exit

Programme toto

#!/bin/bash
./COULEUR
cecho "Bonjour" $rouge
exit


J'ai essayé de changer ./COULEUR par source ./COULEUR mais rien n'y fait ...

Hors ligne

#6 05-09-2017 18:29:45

Lancelot du Lac
Membre
Lieu : France
Distrib. : Jessie | Stretch
Noyau : Linux 3.16.0-4-amd64 | 4.5.0-1-amd64
(G)UI : ZSH / LXDE, Openbox | KDE
Inscription : 22-02-2016

Re : Appel de sous-programmes

Est-ce que tes deux programmes sont bien dans le même dossier ?
D'autre part, tu ne peux pas exécuter la fonction 'cecho' définie dans COULEUR de cette manière-là : elle est dans le processus fils (COULEUR), pas dans le processus père (toto). Il faut se souvenir que les processus fils héritent de leur père, mais l'inverse, évidemment, n'est pas vrai.
Je m'étonne que

source COULEUR

n'ait rien donné, à moins que les deux scripts ne soient pas dans le même dossier. Essaye avec des chemins absolus pour voir.

Dernière modification par Lancelot du Lac (05-09-2017 19:46:35)


Dell Inspiron 7500 series - Debian Stretch - KDE/openbox - ZSH
Samsung - Debian Jessie - LXDE/pas de graphique - ZSH

Hors ligne

#7 05-09-2017 20:03:23

Lancelot du Lac
Membre
Lieu : France
Distrib. : Jessie | Stretch
Noyau : Linux 3.16.0-4-amd64 | 4.5.0-1-amd64
(G)UI : ZSH / LXDE, Openbox | KDE
Inscription : 22-02-2016

Re : Appel de sous-programmes

Je viens de tester tes scripts et j'ai fait quelques modifs pour que ça fonctionne. Modifie-les comme suit :
COULEUR


#!/bin/bash
bleu="\033[34m"
Reset="\033[0m"
cecho ()    
{
message=$1
color=$2
echo -e "$color$message$RESET"
}
 



toto


#!/bin/bash
source COULEUR
cecho "Bonjour" $bleu
exit 0
 



Pour donner plus d'explications :
- le exit à la fin de COULEUR provoquait forcément... l'arrêt du script !
- j'ai changé le nom de la couleur, parce que cela correspond à du bleu, non à du rouge. Regarde cette page : https://www.admin-linux.fr/bash-de-la-c … -le-shell/
- il faut ajouter le paramètre -e pour que echo interprète les anti-slash
- source est le seul moyen d'obtenir les fonctions et paramètres de COULEUR (autant que je sache, du moins)
- j'ai rajouté un 0 après exit pour indiquer au shell que tout s'est bien passé (mais ce n'est pas obligatoire)

Voilà, voilà. J'espère que ça t'aura aidé.


Dell Inspiron 7500 series - Debian Stretch - KDE/openbox - ZSH
Samsung - Debian Jessie - LXDE/pas de graphique - ZSH

Hors ligne

#8 06-09-2017 09:48:22

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : Appel de sous-programmes

Lancelot du Lac a écrit :

- il faut ajouter le paramètre -e pour que echo interprète les anti-slash


On peut aussi utiliser printf (à la place de « echo -e ») qui interprète les séquences
d'échappement quoi qu'il en soit. Il faut l'utiliser de cette façon :


printf "$color$message$RESET\n"
 

Hors ligne

#9 08-09-2017 10:05:28

Philou
Membre
Distrib. : Debian 10
Noyau : Linux 4.19.0-5-amd64
Inscription : 03-09-2017

Re : Appel de sous-programmes

J'ai recopié les deux exemples afin d'éviter une erreur quelconque, mais j'ai toujours :
source: not found
cecho: not found

Même en donnant le chemin complet de COULEUR, qui pourtant est dans le même répertoire, c'est idem ....:rolleyes:

Hors ligne

#10 08-09-2017 16:52:14

Lancelot du Lac
Membre
Lieu : France
Distrib. : Jessie | Stretch
Noyau : Linux 3.16.0-4-amd64 | 4.5.0-1-amd64
(G)UI : ZSH / LXDE, Openbox | KDE
Inscription : 22-02-2016

Re : Appel de sous-programmes

Il est normal que cecho ne soit pas trouvé, si source ne fonctionne pas. J'ai l'impression que c'est la fonction source elle-même qui ne marche pas, ce qui est... bizarre. Peux-tu essayer de faire ceci dans la ligne de commande :

source COULEUR


et que donne :

. COULEUR

?
'.' est un synonyme de 'source'.

Dernière modification par Lancelot du Lac (08-09-2017 16:52:29)


Dell Inspiron 7500 series - Debian Stretch - KDE/openbox - ZSH
Samsung - Debian Jessie - LXDE/pas de graphique - ZSH

Hors ligne

#11 08-09-2017 19:33:23

Philou
Membre
Distrib. : Debian 10
Noyau : Linux 4.19.0-5-amd64
Inscription : 03-09-2017

Re : Appel de sous-programmes

Lancelot du Lac a écrit :

Il est normal que cecho ne soit pas trouvé, si source ne fonctionne pas. J'ai l'impression que c'est la fonction source elle-même qui ne marche pas, ce qui est... bizarre. Peux-tu essayer de faire ceci dans la ligne de commande :

source COULEUR


et que donne :

. COULEUR

?
'.' est un synonyme de 'source'.



Il ne se passe rien mon cher Lancelot...

Hors ligne

#12 08-09-2017 19:45:08

Lancelot du Lac
Membre
Lieu : France
Distrib. : Jessie | Stretch
Noyau : Linux 3.16.0-4-amd64 | 4.5.0-1-amd64
(G)UI : ZSH / LXDE, Openbox | KDE
Inscription : 22-02-2016

Re : Appel de sous-programmes

Ce qui signifie que ça marche en ligne de commande. Après que tu as lancé

. COULEUR

tu dois avoir accès à la fonction cecho. Peux-tu tester cela en ligne de commandes ?

Autre question : aurais-tu la possibilité de tester tes scripts sur une autre machine ? Sur une machine virtuelle par exemple ? Parce que j'ai du mal à comprendre pourquoi ça ne fonctionne pas vu que chez moi, ça fonctionne très bien.


Dell Inspiron 7500 series - Debian Stretch - KDE/openbox - ZSH
Samsung - Debian Jessie - LXDE/pas de graphique - ZSH

Hors ligne

#13 09-09-2017 07:51:28

Philou
Membre
Distrib. : Debian 10
Noyau : Linux 4.19.0-5-amd64
Inscription : 03-09-2017

Re : Appel de sous-programmes

Lancelot du Lac a écrit :

#!/bin/bash
source COULEUR
cecho "Bonjour" $bleu
exit 0



Idem sur VM Lancelot,
source: not found
cecho: not found

Tu as dû omettre un paramètre quelconque ...

Hors ligne

#14 09-09-2017 08:02:10

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : Appel de sous-programmes

Philou a écrit :

Idem sur VM Lancelot,
source: not found
cecho: not found

Tu as dû omettre un paramètre quelconque ...


Chez moi, ça marche comme dit Lancelot. En plus, que cecho ne soit pas trouvé, soit.
Mais source est une commande interne de bash. Donc à moins que tu n'utilises pas
bash je ne vois pas bien comment ça se pourrait.
En sh il faut utiliser la commande interne « . » à la place de source de cette façon :


#!/bin/bash
. COULEUR
cecho "Bonjour" $bleu
exit 0
 



D'ailleurs si cecho n'est pas trouvé, c'est parce que source ne fonctionne pas.

EDIT: J'en profite pour donner une petite astuce pratique pour débugger les shells scripts.
En tout début de script mettre :


set -x
 


Ça permet de mieux voir ce qui se passe.

Dernière modification par enicar (09-09-2017 08:04:18)

Hors ligne

#15 09-09-2017 09:14:25

Lancelot du Lac
Membre
Lieu : France
Distrib. : Jessie | Stretch
Noyau : Linux 3.16.0-4-amd64 | 4.5.0-1-amd64
(G)UI : ZSH / LXDE, Openbox | KDE
Inscription : 22-02-2016

Re : Appel de sous-programmes

Là, ça me dépasse, désolé...
Il faudrait quelqu'un de plus compétent que moi pour comprendre pourquoi une fonction interne ne fonctionne pas.
Je jette l'éponge.

Dell Inspiron 7500 series - Debian Stretch - KDE/openbox - ZSH
Samsung - Debian Jessie - LXDE/pas de graphique - ZSH

Hors ligne

#16 09-09-2017 12:50:36

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : Appel de sous-programmes

Lancelot du Lac a écrit :

Il faudrait quelqu'un de plus compétent que moi pour comprendre pourquoi une fonction interne ne fonctionne pas.


Il y a plusieurs possibilités. La plus simple c'est que philou n'utilise pas bash mais sh qui est
lien symbolique vers dash. Une plus tordue serait que source a été désactivé par


enable -n source
 


Mais je doute fort que ce soit le cas. Allez, je parie pour la première hypothèse wink

Hors ligne

#17 09-09-2017 13:12:32

Philou
Membre
Distrib. : Debian 10
Noyau : Linux 4.19.0-5-amd64
Inscription : 03-09-2017

Re : Appel de sous-programmes

enicar a écrit :

Lancelot du Lac a écrit :

Il faudrait quelqu'un de plus compétent que moi pour comprendre pourquoi une fonction interne ne fonctionne pas.


Il y a plusieurs possibilités. La plus simple c'est que philou n'utilise pas bash mais sh qui est
lien symbolique vers dash. Une plus tordue serait que source a été désactivé par


enable -n source
 


Mais je doute fort que ce soit le cas. Allez, je parie pour la première hypothèse wink



Merci Enicar, effectivement en tapant bash toto au lieu de sh toto, tout fonctionne. Mais j'aimerais bien connaître les conséquences de chacune de ces deux commandes pour lancer un programme ?? smile

Hors ligne

#18 09-09-2017 19:34:36

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : Appel de sous-programmes

Philou a écrit :

Merci Enicar, effectivement en tapant bash toto au lieu de sh toto, tout fonctionne. Mais j'aimerais bien connaître les conséquences de chacune de ces deux commandes pour lancer un programme ?? smile



Quelles commandes ? Ta question est un peu trop vague…

Hors ligne

#19 10-09-2017 09:23:47

enicar
Membre
Lieu : pas ici
Distrib. : sid
Noyau : Linux 6.5.3
(G)UI : openbox
Inscription : 26-08-2010

Re : Appel de sous-programmes

Si tu veux parler des différences entre bash et dash, elles sont nombreuses.
Remarque, avant sh était un lien symbolique vers bash. Mais ce dernier
était trop lourd pour les scripts systèmes (notamment du démarrage). Dash a été
créé pour avoir un shell posix qui soit plus léger. Bash n'est pas posix
par défaut. Et il y a des constructions et des mots réservés qui lui sont propres.
On appelle cela des bashisms. Il existe un script perl, checkbashisms qui permet
de savoir si un script comporte de telles constructions. Checkbashisms est dans le
paquet devscripts.
Les différences entre bash et dash ont été évoqués de nombreuses fois sur pas
mal de sites. Je te donne 2 liens en anglais :



Il en existe pleins d'autres.

Hors ligne

#20 11-09-2017 20:52:29

Lancelot du Lac
Membre
Lieu : France
Distrib. : Jessie | Stretch
Noyau : Linux 3.16.0-4-amd64 | 4.5.0-1-amd64
(G)UI : ZSH / LXDE, Openbox | KDE
Inscription : 22-02-2016

Re : Appel de sous-programmes

Ah, tout s'explique ! Je n'avais pas pensé à ça, surtout que le shabang renvoyait bien vers bash. Perso, je fais toujours appel à lui de cette manière :

./toto


Dell Inspiron 7500 series - Debian Stretch - KDE/openbox - ZSH
Samsung - Debian Jessie - LXDE/pas de graphique - ZSH

Hors ligne

#21 18-09-2017 10:08:36

Philou
Membre
Distrib. : Debian 10
Noyau : Linux 4.19.0-5-amd64
Inscription : 03-09-2017

Re : Appel de sous-programmes

Merci pour votre aide !:)

Hors ligne

Pied de page des forums