GNU/Linux >> Tutoriels Linux >  >> Linux

Comment passer des arguments à un script invoqué par la commande source ?

Développer la réponse (actuellement acceptée) de redneb...

TL;DR Besoin de sourcer un script sans arguments de position dans un autre script ? essayez function DoSource() { source test.sh ; } ; DoSource au lieu de simplement source test.sh .

source ing un script sans arguments dans un autre script

L'extrait de Bash manuel dans la question montre les détails de la façon dont les paramètres positionnels sont affectés au script source. En particulier, si la commande source ne spécifie aucun argument , il est affecté à ceux de l'environnement appelant.

Une conséquence est qu'il peut être gênant de source un script ne passant aucun argument dans un autre script.Par exemple, utilisons l'exemple redneb comme test.sh :

echo "I was given $# argument(s):"
printf "%s\n" "[email protected]"

provenant d'un autre script userScript.sh , qui est par ex. le one-liner :

source test.sh

Lors de l'exécution d'un exemple comme ci-dessus :

$ bash userScript.sh a 'b c'
I was given 2 argument(s):
a
b c

test.sh hérite de userScript.sh arguments de position... ce qui n'est pas ce que je veux (si je l'avais fait, j'aurais pu utiliser source test.sh "[email protected]" ).

J'ai trouvé ce qui suit comme une solution de contournement utile :encapsulez la commande source dans une fonction Bash. Le nouveau userScript.sh ressemble à :

function DoSource() { source test.sh ; }
DoSource

rapports :

$ bash userScript.sh a 'b c'
I was given 0 argument(s):

Notez que spécifier un argument vide (source test.sh '' ) n'est pas équivalent, puisque l'argument vide serait passé à test.sh .

Si le script de sourçage doit également être sourcé

Si userScript.sh lui-même est censé être sourcé, alors on ne veut probablement pas laisser DoSource() autour de. Dans ce cas, la solution simple est l'autodestruction :

function _userScript_sh_DoSource() { source test.sh ; unset "$FUNCNAME" ; }
_userScript_sh_DoSource

pour une utilisation unique (le nom de la fonction a été choisi pour réduire les risques de conflits de noms) ; ou un unset _userScript_sh_DoSource la commande peut être placée après _userScript_sh_DoSource n'est plus nécessaire.

Variante flexible à usage multiple

Une variante plus complexe de DoSource() :

function DoSource() { local ScriptName="$1" ; shift ; source "$ScriptName" ; }
DoSource test1.sh
DoSource test1.sh "[email protected]"
DoSource test2.sh

peut être utilisé comme un remplacement "drop-in" pour source , la seule différence étant que lorsqu'aucun argument de position n'est spécifié pour le script à sourcer, source en hérite, tandis que DoSource n'en utilise aucun. Notez cependant que DoSource est une fonction et en tant que telle se comporte différemment de source dans d'autres aspects (par exemple, appel de pile, FUNCNAME , ...).


Créer un fichier test.sh avec le contenu suivant :

echo "I was given $# argument(s):"
printf "%s\n" "[email protected]"

puis sourcez-le à partir d'une session shell interactive :

$ source ./test.sh a 'b c'
I was given 2 argument(s):
a
b c

vous accédez donc aux arguments comme vous le feriez dans un script bash normal, avec [email protected] ou $1 , $2 , $3 , etc.

À titre de comparaison, exécutez-le comme un script normal :

$ bash ./test.sh a 'b c'
I was given 2 argument(s):
a
b c

Linux
  1. Comment créer un script d'une commande Linux

  2. Passer les arguments de la ligne de commande au script Bash ?

  3. Comment gérer les commutateurs dans un script shell ?

  4. Nagios :comment activer les arguments de ligne de commande check_nrpe

  5. Comment utiliser les lignes d'un fichier comme arguments d'une commande ?

Comment exécuter une commande / un script Linux Shell en arrière-plan

Comment stocker une commande Linux en tant que variable dans un script shell

Comment transmettre un mot de passe à la commande SSH sous Linux

Comment exécuter une commande dans un script shell ?

Comment lire les arguments de ligne de commande dans les scripts shell ?

Comment passer plusieurs arguments à exécuter avec le script .sh