Per favore dimmi come esportare una funzione nella shell genitore (bash, sh o ksh) in modo che la funzione sia disponibile per tutto il processo figlio lanciato dal processo genitore?
Per favore dimmi come esportare una funzione nella shell genitore (bash, sh o ksh) in modo che la funzione sia disponibile per tutto il processo figlio lanciato dal processo genitore?
Risposte:
La export -f
funzionalità è specifica di Bash:
genitore
#!/bin/bash
plus1 () { echo $(($1 + 1)); }
echo $(plus1 8)
export -f plus1
./child 14 21
bambino
#!/bin/bash
echo $(plus1 $(($1 * $2)) )
In sh
, è non è possibile esportare una funzione, come notato da Charles Duffy .
Se stai usando ksh o zsh:
Puoi usare la variabile d'ambiente FPATH
, in cui puoi inserire tutte le tue funzioni.
Se FPATH
è impostato su un interprete interattivo e un comando o una funzione non viene trovato nell'ambiente di shell corrente o in PATH
, nelle directory elencate viene ricercata l'esistenza di un file denominato dopo il comando mancante. Se ne viene trovata una, viene fornita nell'ambiente shell corrente e si prevede che definisca la funzione.
Quindi, puoi posizionare tutte le tue funzioni in una posizione in FPATH
e anche gli script figli saranno in grado di trovarle.
È possibile utilizzare il autoload
comando negli script della shell per caricare le funzioni necessarie:
autoload fun_a fun_b
In zsh, autoload
è richiesto per FPATH
funzionare. In ksh
e nei suoi parenti stretti, credo che faccia semplicemente in modo che le funzioni definite in FPATH
sovrascrivano il comando regolare nel tuo PATH, come farebbero se definite direttamente.
Alcuni dettagli su FPATH
e autoload
:
Se crei subshell con ( )
, erediteranno un'istantanea di tutte le definizioni, parametri e variabili di shell.
Se li esegui come programmi, puoi inserire le definizioni .bashrc
.
Se stai cercando di falsificare uno script esistente per eseguire un wrapper o la sostituzione di un comando PATH, .bashrc
funzionerà a seconda dei dettagli dell'esecuzione. In caso contrario, potresti invece eseguire uno script wrapper che fa semplicemente un .
o source
di un file di inclusione che definisce le funzioni e poi fa la stessa cosa con lo script di shell con i comandi da sostituire.
Lo script wrapper potrebbe essere simile a:
script=$1
shift
. include.sh
. $script "$@"
L'idea è che il primo parametro è il nome dello script reale e i parametri rimanenti sono gli argomenti, quindi viene eseguito lo script precedente.
declare -x -f NAME
Ulteriori informazioni
-f limita l'azione o la visualizzazione ai nomi e alle definizioni delle funzioni -x per esportare NAME
bash
. ( ksh
'S controparte declare
, typeset
, ha un -x
opzione, ma si applica solo a variabili , non funzioni; idem per zsh
).