source some_file
un_fichier:
doit ()
{
echo doit $1
}
export TEST=true
Si je source un fichier, la fonction "doit" et la variable TEST sont disponibles sur la ligne de commande. Mais en exécutant ce script:
script.sh:
#/bin/sh
echo $TEST
doit test2
Renverra la valeur de TEST, mais générera une erreur concernant la fonction inconnue "doit".
Puis-je également "exporter" la fonction ou dois-je utiliser source_file dans script.sh pour pouvoir utiliser la fonction à cet endroit?
#!/bin/sh
pour#!/bin/bash
et juste aprèsdoit() {...}
export -f doit
#!/bin/sh
aussi, mais il est recommandé de l’utiliser#!/bin/bash
afin d’éviter les problèmes lorsque le shell par défaut n’est pas bash.Réponses:
Dans Bash, vous pouvez exporter les définitions de fonctions vers un sous-shell avec
Par exemple, vous pouvez essayer cet exemple simple:
./script1
:./script2
:Ensuite, si vous appelez,
./script1
vous verrez la sortie Hello! .la source
"Exporter" une fonction en utilisant
export -f
crée une variable d'environnement avec le corps de la fonction. Considérons cet exemple:Cela signifie que seul le shell (juste Bash?) Pourra accepter la fonction. Vous pouvez également définir la fonction vous-même, car le Bash ne considère que les envvars commençant par
() {
:Si vous devez "exporter" cette variable sur SSH, vous avez vraiment besoin de la fonction sous forme de chaîne. Cela peut être fait avec l'option d'impression (
-p
) pour les fonctions (-f
) de la fonctiondeclare
intégrée:Ceci est très utile si vous avez du code plus complexe qui doit être exécuté sur SSH. Considérez le script fictif suivant:
la source
fn2='() { echo Hi;}' sh -c fn2
N'a pas travaillé pour moi. Sur Linux avecsh
bash v5.0.7, je l’aish: fn2: command not found
. Sur Ubuntu avecsh
dash v0.2.3, je l'aish: 1: fn2: not found
. Quelsh
shell avez-vous utilisé?f(){ echo a;}; export -f f; echo "$f"; sh -c 'printenv f; echo "$f"'
n'imprime rien pour moi, ilf
est donc clair que ce n'est pas exporté en tant que chaîne simple. J'ai testé avec les deux combinaisons mentionnées ci-dessus.sh
exécuter cette chaîne en tant que fonction? Dans votre exemple,fn2='() { echo Hi;}' sh -c fn2
la commandefn2
donnée àsh
est littéralement la chaîne"fn2"
.sh
devrait rechercher une telle commande dans son PATH mais ne devrait pas rechercher s'il existe une variable$fn2
, développer cette variable et exécuter sa valeur en tant que fonction - cela me semble être un problème de sécurité majeur. edit: Je pense que c'est ça! Votre comportement affiché était-il un bogue de sécurité connu sous le nom de ShellShock / Bashdoor ?fn(){ echo foo; }; export -f fn; env | grep foo
SortiesBASH_FUNC_fn%%=() { echo foo
S'appuyant sur la réponse de @ Lekensteyn ...
Si vous l'utilisez
declare -pf
, toutes les fonctions précédemment définies dans le shell actuel seront sorties vers STDOUT.À ce stade, vous pouvez rediriger STDOUT où vous le souhaitez et, dans la pratique, farcir les fonctions précédemment définies où vous le souhaitez.
La réponse suivante va les fourrer dans une variable. Ensuite, nous renvoyons cette variable à l'appel de la fonction que nous voulons exécuter dans le nouveau shell créé en tant que nouvel utilisateur. Nous faisons cela en utilisant
sudo
avec le commutateur-u
(aka.user
) Et en exécutant simplement Bash (qui recevra le STDOUT acheminé comme entrée à exécuter).Comme nous savons que nous passons d’un shell Bash à un shell Bash, nous savons que Bash interprétera correctement les fonctions définies par les shell précédents. La syntaxe devrait être correcte tant que nous passons d'un shell Bash de la même version à un nouveau shell Bash de la même version.
YMMV si vous vous déplacez entre différents shells ou entre des systèmes pouvant avoir différentes versions de Bash.
la source
Vous ne pouvez pas exporter de fonctions, pas comme vous le décrivez. Le shell ne chargera le
~/.bashrc
fichier qu'au début d'un shell interactif (recherchez "Invocation" dans la page de manuel bash ).Ce que vous pouvez faire est de créer une "bibliothèque" qui est chargée lorsque vous démarrez le programme:
Et placez-y vos fonctions et paramètres non interactifs.
la source
BASH_ENV
la variable d'environnement quesome_file
vous avez déjà, et elle s'appellerait. Il serait assez facile de le savoir:echo echo foobar > /tmp/foobar; BASH_ENV=/tmp/foobar $SHELL -c :
eval "$(declare -F | sed -e 's/-f /-fx /')"
exportera toutes les fonctions.Je fais cela souvent avant de démarrer un shell interactif dans un script pour pouvoir déboguer et travailler dans le contexte du script tout en utilisant ses fonctions et ses variables.
Exemple:
la source
Les fonctions ne sont pas exportées vers des sous-processus. C'est pourquoi il existe des fichiers nommés .kshrc ou .bashrc: pour définir des fonctions qui devraient également être disponibles dans les sous-shell.
Si vous exécutez un script, les scripts. * Shrc ne sont normalement pas fournis. Vous auriez à coder cela explicitement, comme dans
. ~/.kshrc
.la source
rm=rm -i
)Eh bien, je suis nouveau sur Linux, mais vous pouvez essayer ceci. Dans certains fichiers, appelons-le, 'tmp / general' vous construisez votre fonction:
Dans votre script, ajoutez:
et courir:
Vous aurez à l'écran:
func from general
.la source
Plus d'informations
la source