Вместо ограничения переменных подоболочками вы можете запустить b
как новый процесс. Тогда у него не будет доступа ни к одной из переменных вызывающего, кроме тех, которые вы выбрали для экспорта.
Если она вам нужна только для одной функции, переместите эту функцию в отдельный скрипт.
b
:
#!/usr/bin/env mksh
set -u -e -o pipefail
echo "in b: VAL= $val"
Вывод:
in a: VAL= myval
./b[4]: val: parameter not set
Если у вас есть много функций, которые нуждаются в этом, вы можете переместить их все в один файл и включить функцию-оболочку в источник и выполнение.
funcs
:
#long options not passed on by -$-
set -o pipefail
#execute function without inheriting environment variables
function ni () {
WHERE="${_%/*}"
mksh -$- -c "source $WHERE/funcs ; $*"
}
function a () {
local +x val="myval"
echo "in a: VAL= $val"
ni b
}
function b () {
echo "in b: VAL= $val"
}
Эта «библиотека» должна быть источником
d из основного скрипта:
#!/usr/bin/env mksh
set -e -u -o pipefail
WHERE="${_%/*}"
source $WHERE/funcs
a
Недостаток этого заключается в том, что вы теряете местоположение (скрипт и номер строки) ошибки:
in a: VAL= myval
mksh: val: parameter not set