Sto leggendo questo post sull'uso delle funzioni nelle variabili della shell bash. Osservo che per utilizzare le funzioni della shell, è necessario esportarle ed eseguirle in una shell figlio come segue:
$ export foo='() { echo "Inside function"; }'
$ bash -c 'foo'
Inside function
Voglio chiedere se è possibile definire le funzioni nelle variabili della shell bash in modo tale che possano essere eseguite nella shell corrente senza usare export ed eseguire una nuova shell?
Risposta accettata:
No, non puoi.
Se vuoi usare una funzione nella shell corrente, semplicemente definendola, usala in seguito:
$ foo() { echo "Inside function"; }
$ foo
Inside function
Prima del giorno di Shellshock, puoi memorizzare la funzione all'interno di una variabile, esportare la variabile e usare la funzione nella sottoshell, perché bash
supporta la funzione di esportazione, bash
inserirà la definizione della funzione nella variabile di ambiente come:
foo=() {
echo "Inside function"
}
quindi interpreta la funzione sostituendo =
con spazio. Non c'è intenzione di inserire la funzione nella variabile e fare riferimento alla variabile che eseguirà la funzione.
Ora, dopo che Stéphane Chazelas ha trovato il bug, quella funzionalità è stata rimossa, nessuna definizione di funzione è più memorizzata in una semplice variabile di ambiente. Ora le funzioni esportate verranno codificate aggiungendo il prefisso BASH_FUNC_
e suffisso %%
per evitare di scontrarsi con le variabili di ambiente. bash
l'interprete può ora determinare se sono funzioni di shell o meno indipendentemente dal contenuto delle variabili. Devi anche definire la funzione ed esportarla in modo esplicito per usarla nella sub-shell:
$ foo() { echo "Inside function"; }
$ export -f foo
$ bash -c foo
Inside function
Ad ogni modo, se il tuo esempio ha funzionato con il tuo attuale bash
, stai utilizzando una versione vulnerabile.