Почему emacs не предустановлен? [закрыто]

Вместо ограничения переменных подоболочками вы можете запустить 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
6
05.04.2015, 12:21
0 ответов

Теги

Похожие вопросы