Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/02/2019, à 21: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, à 17: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, à 22: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, à 22: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.

Hors ligne

#4 Le 18/02/2019, à 22: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, à 22: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.

Hors ligne

#6 Le 19/02/2019, à 01: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, à 05: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.

Hors ligne

#8 Le 19/02/2019, à 10: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 ! roll

Hors ligne

#9 Le 19/02/2019, à 13: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)   smile smile smile   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)mad  Ou alors je n'ai pas les yeux en face des trous. roll

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 smile


Laptop Lenovo Ubuntu 20.04 LTS / DELL Mint 20.2 - XFCE / Laptop HP Mint 20.2 - XFCE

Hors ligne

#10 Le 19/02/2019, à 13: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, à 18:45

lynn

Re : (résolu) où stocker fonctions en vue utilisation dans autres scripts ?

Watael a écrit :

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, à 23:24

Watael

Re : (résolu) où stocker fonctions en vue utilisation dans autres scripts ?

on l'a déjà dit :

watael a écrit :

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 ajoutant

if [ -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.

Hors ligne

#13 Le 21/02/2019, à 17: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, à 17: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, à 17: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