Č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.