Čtu tento příspěvek o používání funkcí v proměnných bash shellu. Všiml jsem si, že k použití funkcí shellu je třeba je exportovat a spustit v podřízeném prostředí takto:
$ export foo='() { echo "Inside function"; }'
$ bash -c 'foo'
Inside function
Chci se zeptat, zda je možné, aby funkce byly definovány v proměnných bash shellu tak, aby mohly být spouštěny v aktuálním shellu bez použití exportu a spuštění nového shellu?
Přijatá odpověď:
Ne, nemůžete.
Pokud chcete použít funkci v aktuálním shellu, stačí ji definovat a použít ji později:
$ foo() { echo "Inside function"; }
$ foo
Inside function
Před dnem Shellshock můžete uložit funkci do proměnné, exportovat proměnnou a použít funkci v sub-shell, protože bash podporuje funkci exportu, bash vloží definici funkce do proměnné prostředí jako:
foo=() {
echo "Inside function"
}
pak interpretujte funkci nahrazením = s prostorem. Není záměrem vkládat funkci do proměnné a odkazovat na to, že proměnná funkci vykoná.
Nyní, poté, co Stéphane Chazelas našel chybu, byla tato funkce odstraněna, žádná definice funkce již není uložena v prosté proměnné prostředí. Nyní budou exportované funkce zakódovány přidáním prefixu BASH_FUNC_ a přípona %% aby nedošlo ke střetu s proměnnými prostředí. bash interpret nyní může určit, zda jsou nebo nejsou funkcí shellu bez ohledu na obsah proměnných. Musíte také definovat funkci a explicitně ji exportovat, abyste ji mohli použít v sub-shell:
$ foo() { echo "Inside function"; }
$ export -f foo
$ bash -c foo
Inside function
Každopádně, pokud váš příklad fungoval s vaším aktuálním bash , pak používáte zranitelnou verzi.