Forum Programmation.shell Besoin d'un petit cours sur export dans un script bash

Posté par  . Licence CC By‑SA.
Étiquettes :
1
29
nov.
2024

Bonjour à tous,

mon script :

VAR1EXPORT=toto
export VAR1EXPORT
VAR2EXPORT=tata
export VAR2EXPORT

Exec 1:

{promt}mon_script

Exec 2:

{promt}. mon_script

Qestion

Dans le premier cas, cela ne fonctionne pas (une fois le script terminé les variables ne sont pas exporté dans le shell)
Dans le deuxième car, ça fonctionne (les variables sont présente dans le shell)

Merci de m'expliquer ou me fournir un lien vers un doc pour comprendre.

En vous remerciant d'avance.

  • # linuxfr et les / dans le corps du texte

    Posté par  . Évalué à 0 (+0/-3).

    j'imagine que ton exec2 c'est en fait
    ./mon_script

    cela n'a en fait rien à voir avec l'export
    c'est le chemin de recherche (le PATH) de l'executable qui entre en jeu

    en faisant
    mon_script il va chercher mon_script dans le PATH, et pas forcement dans le dossier local
    ./mon_script il va chercher dans le dossier courant ./

  • # Commande source

    Posté par  . Évalué à 4 (+2/-0).

    Ça serait bien d’être plus précis, et surtout d'expliquer ce qui ne fonctionne pas.

    Mais avec le contexte on peut deviner. Je suppose que tu voudrais les variables VAR1EXPORT et VAR2EXPORT accessible dans ton shell après avoir lancé ton script.

    Dans le premier cas, ton script s’exécute dans un autre shell, indépendant de ton shell actuel. Donc les variables ne sont pas exportés dans ta session actuelle.

    La commande . est un alias de source en bash, qui exécute ton script dans ton shell courant. Si tu veux plus d'infos tu peux chercher source bash.

  • # Résolu

    Posté par  . Évalué à 3 (+2/-0).

    J'ai trouvé.
    . est un alias de source

    source est documenté.

    en gros source permet de ne pas créer un nouveau processus shell pour exécuté le script (donc exécuté dans le shell courant)

    • [^] # Re: Résolu

      Posté par  (site web personnel) . Évalué à 5 (+2/-0).

      Les variables exportées sont transmises aux processus enfants, pas aux ancêtres, oncles et autres cousins éloignés.

      J'ai rajouté ça à ton script :

      echo "mon PID est $$ et VAR1EXPORT=$VAR1EXPORT VAR2EXPORT=$VAR2EXPORT"

      Testons :

      mon pid est 118671 et VAR1EXPORT= VAR2EXPORT=autrechose
      ./mon_script 
      mon PID est 118836 et VAR1EXPORT=toto VAR2EXPORT=tata
      source  ./mon_script 
      mon PID est 118671 et VAR1EXPORT=toto VAR2EXPORT=tata

      L'identifiant du shell / processus initial est 118671, VAR1EXPORT est initialement vide ou inexistante et VAR2EXPORT vaut "autrechose".
      J'exécute le script dans un autre shell / processus (118836) et là les valeurs sont bien respectivement toto et tate.
      Et si je le source, je trouve le PID initial de 118671, et il a bien écrasé la valeur de VAR1EXPORT et définie celle de VAR2EXPORT.

  • # ne pas confondre source (ou '.') et export

    Posté par  . Évalué à 2 (+0/-0).

    export mavariable

    Cette commande indique que la valeur de la variable sera accessible aux processus enfants du processus shell courant.

    source : le contenu du fichier passé en paramètre est évalué dans le processus shell courant ( il n'y a pas de sous-shell d'exécuté).

    pas besoin de la commande source pour faire un export de variable. En pratique la commande source (ou .) permet par exemple de splitter des scripts shell en plusieurs fichiers sources contenant par exemple des fonctions ( une espèce d'include).

  • # La différence

    Posté par  (Mastodon) . Évalué à 4 (+1/-0). Dernière modification le 30 novembre 2024 à 08:56.

    Ton script contient des commandes (quelle qu'elles soient).

    Si tu le lances comme dans la première méthode, un nouveau shell va être créé, et ce script s'exécutera dans ce nouveau shell, qui sera détruit à la fin de la commande. Si tu le lances selon la 2e méthode (avec le . ou la commande source), il sera exécuté dans le shell courant.

    Du coup maintenant on va s'intéresser au script.

    Si ce sont des commandes externes, comme ls ou ps par exemple ça ne changera pas grand chose. Par contre si ce sont des commandes pour modifier le shell lui-même, évidemment que ça changera ! Là tu as des export, qui rajoutent des variables (d'ailleurs t'aurais le même phénomène sans le export, rien qu'en déclarant tes variables) dans le shell, donc en effet, selon la méthode utilisée soit tu crées un shell, tu y mets ces variables et tu détruis le shell évidemment tu as tout perdu, alors que selon la 2e méthode, ces variables seront conservées dans le shell courant.

    Un autre exemple avec lequel tu peux jouer c'est cd. Selon quelle méthode d'invocation tu utilises, à la fin du script tu te seras déplacé ou pas.

    En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

    • [^] # Re: La différence

      Posté par  . Évalué à 1 (+0/-0). Dernière modification le 30 novembre 2024 à 10:07.

      J'aime bien ton exemple du "cd", pour le coup c'est nettement plus parlant.

      #!/bin/sh
      cd ..
      echo "Le dossier courant est $PWD"

      Les vrais naviguent en -42

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.