(Линукс Баш 4.1.2) У меня есть функция bash, вызывающая другую функцию. Функция низкого уровня хочет установить -xv для отладки, но я не хочу, чтобы она связывалась со значениями x и v в родительской функции. т.е. Я хочу, чтобы дочерняя функция нажимала -xv, а затем восстанавливала предыдущую настройку при возврате. Например.:
function outer(){ echo starting; inner; echo done; }
function inner(){
set -xv
echo inside
set +xv
}
outer
Это работает, если параметр external установлен по умолчанию; в противном случае он принудительно +xv в остальной части внешнего кода. Я могу представить какой-нибудь очень запутанный скрипт, который анализирует BASHOPTS, но, похоже, должен быть лучший способ?





Если вам не нужно совместно использовать среду внешнего кода или изменять переменные из outside внутри inside, вы можете запустить подпроцесс с помощью ( inner )
function outer(){ echo starting; inner; echo done; }
function inner(){
(
set -xv
echo inside
)
}
outer
Обратите внимание: поскольку вы выполняете в подоболочке, вам не нужно сбрасывать x и v.
Вы также можете просто обернуть вызов inner во внешний без изменения внутреннего:
function outer(){ echo starting; ( inner ); echo done; }
Дополнительную информацию о подоболочках и областях видимости переменных можно найти здесь. https://www.tldp.org/LDP/abs/html/subshells.html
local save=$-; set -x ... set +x -$save
В сценарии оболочки "-i" удалено из $-.
i не единственный проблемный персонаж.
Это не сработает, если
saveсодержит параметры только для чтения, такие какi.