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