#1 Le 18/02/2019, à 20:39
- cristobal78
(résolu) où stocker fonctions en vue utilisation dans autres scripts ?
Bonjour amis codeurs
Jusqu'ici je n'ai pas utilisé de fonctions dans mes scripts. Mais j'aimerais bien réécrire certains de mes scripts et utiliser la notion de fonctions pour avoir des scripts plus "propres".
Voici par exemple une fonction que je voudrais pouvoir utiliser un peu partout :
# nom fonction : testpaq
# objet : test de présence/absence de paquets
#############################################
testpaq()
{
while [ $# -gt 0 ] ; do
paquet=$1
dpkg-query -l | grep -qE "^.i *$paquet" 2> /dev/null
code=$?
if [ $code -ne 0 ] ; then zenity --warning --text="Ce script a besoin du paquet $paquet pour fonctionner" ; exit ; fi
shift
done
}
J'ai stocké mes scripts dans un dossier nommé : /home/moi/mes_scripts.
J'ai mis ma fct "testpaq" dans un dossier nommé : /home/moi/mes_fonctions.
Mise en oeuvre
Soit un script appelé disons "toto" ( placé dans /home/moi/mes_scripts ) en tête duquel je voudrais placer ma fonction "testpaq" afin de m'assurer que si des paquets manquent alors le script "toto" s’arrête avec le message "Ce script a besoin .... "
Donc dans "toto" j'ai mis :
#!/bin/bash
#######################
# nom du script = toto
#######################
testpaq $1
echo "fin"
mais ça ne marche pas car le terminal me renvoie toujours le mot "fin" et ça que le paquet dans $1 soit ou non installé sur la bécane.
Je soupçonne donc que le script "toto" n'exécute pas la fonction "testpaq".
Est ce pour une une question de chemin ?
a+
Dernière modification par cristobal78 (Le 27/02/2019, à 16:12)
Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE
Hors ligne
#2 Le 18/02/2019, à 21:08
- pingouinux
Re : (résolu) où stocker fonctions en vue utilisation dans autres scripts ?
Bonsoir,
Pour que la fonction testpaq soit connue du script toto, ajoute après la première ligne de toto et avant l'appel de testpaq :
source /home/moi/mes_fonctions/fichier_qui_contient_testpaq
Hors ligne
#3 Le 18/02/2019, à 21:14
- Watael
Re : (résolu) où stocker fonctions en vue utilisation dans autres scripts ?
salut,
il faut sourcer le(s) fichier(s) qui contien(en)t la/es fonction(s).
au fait :
testPkg()
{
for pkg do
if dpkg-query -l | grep -qE "^.i *$pkg" &> /dev/null
then
zenity --warning --text="Ce script a besoin du paquet $paquet pour fonctionner"
exit 1
fi
done
}
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#4 Le 18/02/2019, à 21:30
- lynn
Re : (résolu) où stocker fonctions en vue utilisation dans autres scripts ?
Bonjour,
En les plaçant dans le fichier
~/.bash_functions
et en ajoutant
if [ -f ~/.bash_functions ]; then
. ~/.bash_functions
fi
dans
~/.bashrc
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#5 Le 18/02/2019, à 21:41
- Watael
Re : (résolu) où stocker fonctions en vue utilisation dans autres scripts ?
si les fonctions doivent être appelées dans un script qu'elles soient sourcées dans .bashrc ne fera rien.
elles seront disponibles dans le shell courant, mais pas dans un script, car les scripts n'appellent pas .bashrc !
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#6 Le 19/02/2019, à 00:54
- cristobal78
Re : (résolu) où stocker fonctions en vue utilisation dans autres scripts ?
bonsoir
@watael et pingouinux
Je pensais que les fonctions devaient être stockées dans un répertoire mais si je comprends bien pingouinux et watael les fonctions doivent être stockées dans un fichier. C'est bien ça ?
Autrement dit au lieu d'avoir un répertoire appelé mes_fonctions pour stocker mes fonctions perso, je dois
- créer un fichier script avec un shebang #! /bin/bash
- le nommer par exemple "mes_fonctions"
- placer ce fichier dans le même répertoire que mes scripts
- dans le corps de ce fichier j'empile bout à bout mes fonctions perso comme suit :
#! /bin/bash
fonction1()
{
.....
}
####
fonctio2()
{
....
}
####
fonctio3()
{
...
}
Ensuite pour appeler fonction3, par exemple, dans le cadre d'un script je dois mettre en début de ce script
#! /bin/bash
source /home/moi/mes_scripts/mes_fonctions
fonction3
....
@watael
tu suggères que "for do done" est mieux que mon "while do shift done" ?
Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE
Hors ligne
#7 Le 19/02/2019, à 04:25
- Watael
Re : (résolu) où stocker fonctions en vue utilisation dans autres scripts ?
un fichier qui sera toujours sourcé n'a pas à être exécutable, et n'a donc pas à avoir un shebang.
on ne peut pas "appeler" seulement une fonction contenue dans un fichier qui en contiendrait d'autres.
en sourçant un fichier, tout son contenu est exécuté dans le script appelant, alors toutes les fonctions du fichier sourcé seront disponibles.
il est possible de créer un répertoire qui contiendra plusieurs fichiers qui, lui, contiendra une fonction, ou un ensemble de fonctions "relatives".
chaque fichier devra alors être sourcé pour que la fonction qu'il contient soit disponible dans le script.
enfin, oui, for ;do ;done est plus simple pour parcourir des paramètres positionnels, pour un script comme pour une fonction.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#8 Le 19/02/2019, à 09:30
- kholo
Re : (résolu) où stocker fonctions en vue utilisation dans autres scripts ?
salut,
les scripts perso se mettent dans un dossier bin placé dans le dossier personnel
il sera ajouté automatiquement au $PATH par le système à la prochaine reconnexion !
Hors ligne
#9 Le 19/02/2019, à 12:11
- cristobal78
Re : (résolu) où stocker fonctions en vue utilisation dans autres scripts ?
Hello All,
@watael
merci pour ces info (sur la façon de stocker ses propres fonctions) que je n'ai trouvé ni dans le livre de Christophe Blaess (Eyrolles), ni chez Eric Sanchis, ni chez F. Lang ni dans le ABS Guide (2014) ! Ou alors je n'ai pas les yeux en face des trous.
Pour ce qui est du shebang j'ai bien sur testé ta suggestion et le fichier de stockage des fonctions est opérationnel avec ou sans le shebang.
Cela dit la présence du shebang permet - en tout cas chez moi - une lecture plus sympa car la coloration syntaxique est alors visible et n'apparait pas si pas de shebang.
Autre info que je n'ai pas trouvé : quels caractères sont ils permis et à fortiori interdits pour l'établissement du nom de ma fonction ?
A-t-on le droit par exemple d'appeler une fonction :
ou-v@s_tu_?
@ Kholo
Après vos nombreuses explications/réponses j'ai mis mes fonctions dans un fichier appelé "biblio_fonctions" lui même dans le dossier contenant déjà mes scripts perso et le dossier de scripts perso est bien présent dans mon PATH. Ça devrait être bon
Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE
Hors ligne
#10 Le 19/02/2019, à 12:24
- kholo
Re : (résolu) où stocker fonctions en vue utilisation dans autres scripts ?
si tu fais un
echo $PATH
tu devrais donc avoir tes dossiers indiqués.
pour le dossier bin faire :
mkdir ~/bin
se déconnecter puis se reconnecter
puis mettre des script dans ce dossier
Hors ligne
#11 Le 19/02/2019, à 17:45
- lynn
Re : (résolu) où stocker fonctions en vue utilisation dans autres scripts ?
si les fonctions doivent être appelées dans un script qu'elles soient sourcées dans .bashrc ne fera rien.
elles seront disponibles dans le shell courant, mais pas dans un script, car les scripts n'appellent pas .bashrc !
Et alors, si l'appel à ~/.bash_functions est sourcé dans le script, ça fonctionne. L'utilité, c'est que certaines fonctions peuvent être disponibles également dans un terminal.
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#12 Le 20/02/2019, à 22:24
- Watael
Re : (résolu) où stocker fonctions en vue utilisation dans autres scripts ?
on l'a déjà dit :
il faut sourcer le(s) fichier(s) qui contien(en)t la/es fonction(s).
c'est différent de
En les plaçant dans le fichier ~/.bash_functions
et en ajoutantif [ -f ~/.bash_functions ]; then . ~/.bash_functions fi
dans ~/.bashrc
à cela la réponse est toujours
si les fonctions doivent être appelées dans un script qu'elles soient sourcées dans .bashrc ne fera rien.
test -f ~/.bash_functions && . ~/.bash_functions
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#13 Le 21/02/2019, à 16:34
- cristobal78
Re : (résolu) où stocker fonctions en vue utilisation dans autres scripts ?
Hello
je me réponds à moi même sur la dernière question du post # 9 car j'ai beau chercher partout je ne trouve nulle part un avertissement concernant les caractères autorisés/interdits pour le nom d'une fonction.
Or de même que le nom d'une variable ne peut pas contenir certains caractères tels que par exemple ) = ( et sans doute bien d'autres, le nom d'une fonction ne peut pas utiliser n'importe quel caractère.
Le nom ou-v@s_tu_? (voir post # 9) aussi bizarre soit-il semble être un nom valide pour une fonction.
Je me suis amusé à tester tous les caractères de mon clavier pour donner un nom à une fonction et je suis arrivé à la conclusion suivante :
car. acceptés
@ - + _ | ^ µ ?
car refusés
$ £ % & ) ( = ~ # } { ` \ ! *
Si j'ai vu juste je pense qu'il ne serait pas idiot de le mettre dans la doc ubuntu.
a+ et merci à tous
Dernière modification par cristobal78 (Le 21/02/2019, à 16:39)
Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE
Hors ligne
#14 Le 27/02/2019, à 16:09
- cristobal78
Re : (résolu) où stocker fonctions en vue utilisation dans autres scripts ?
pas de commentaires sur mon dernier post ?
je passe en résolu.
Merci à tous.
Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE
Hors ligne