J'ai défini une bash
fonction dans mon ~/.bashrc
dossier. Cela me permet de l'utiliser dans des terminaux shell. Cependant, il ne semble pas exister lorsque je l'appelle depuis un script.
Comment puis-je définir une bash
fonction à utiliser également par les scripts?
bash
shell-script
function
Onturenio
la source
la source
/bin/sh
dans la ligne shebang?Réponses:
~/.bash_profile
et~/.bashrc
ne sont pas lus par les scripts, et les fonctions ne sont pas exportées par défaut. Pour ce faire, vous pouvez utiliserexport -f
comme suit:export -f foo
pourrait également être appelé~/.bash_profile
pour rendre cette fonction disponible aux scripts après la connexion. Soyez averti que ceexport -f
n'est pas portable.Une meilleure solution serait de trouver le fichier contenant la fonction en utilisant
. file
. C'est beaucoup plus portable et ne dépend pas de la configuration particulière de votre environnement.la source
function myFunction { ... }
dans~/.bash_profile
et vous êtes prêt à partir?export
solution semble fonctionner correctement. Merci.foo
fonctions de certainsfile
2) Vous pouvez mieux contrôler le contenu de celafile
que vous assurer que le shell appelant n'a pas changéfoo
avant d'invoquer votre script. Vous pouvez ajouter des contrôles de sécuritéfile
pour vous assurer qu'il n'est pas altéré, par exemple. (pas facile, mais possible). (eh bien, vous pouvez également faire ces vérifications sur la fonction foo définie ... mais vous obtenez ma dérive ^^ Je pense que la méthode 2 est plus propre.) 3)file
ne contiendra que ce qui est nécessaire, pas plus..bashrc
n'est lu que par des shells interactifs. (En fait, c'est une simplification excessive: bash est excentrique à cet égard. Bash ne lit pas.bashrc
s'il s'agit d'un shell de connexion, interactif ou non. Et il y a une exception même à l'exception: si le processus parent de bash estrshd
ousshd
, alors bash lit.bashrc
, que ce soit interactif ou non.)Placez vos définitions de fonctions dans un fichier à un endroit connu et utilisez le
.
source
module intégré (également orthographié ) pour inclure ce fichier dans un script.Si vous le souhaitez, vous pouvez suivre la fonction de chargement automatique de ksh. Placez chaque définition de fonction dans un fichier portant le même nom que la fonction. Liste les répertoires contenant les définitions de fonction dans la
FPATH
variable (une liste de répertoires séparés par deux-points). Voici une approximation grossière de kshautoload
qui charge en fait la fonction immédiatement au lieu de sur demande:la source
Avez-vous besoin d' une fonction? Sinon, envisagez d'extraire la logique dans un script Bash distinct et autonome dans votre
$PATH
. Par exemple, j'avais ceci dans mon~/.bashrc
:~/bin
est dans mon$PATH
, j'ai donc créé~/bin/wanip
avec le contenu suivant:Et a couru
chmod 0755 ~/bin/wanip
pour le rendre exécutable. Maintenant, je peux exécuter àwanip
partir d'autres scripts.J'aime avoir
wanip
un script Bash autonome. Cela me rappelle que je veux que cette logique soit généralement disponible (en plus de ma session Bash interactive actuelle). Le script encapsule bien la logique et la documentation de celui-ci.la source