#bash #function #verbose
#bash #функция #подробный
Вопрос:
(Linux bash 4.1.2) У меня есть функция bash, вызывающая другую функцию. Функция низкого уровня хочет установить -xv для отладки, но я не хочу, чтобы она путалась со значениями x и v в родительской функции. Т.Е. я хочу, чтобы дочерняя функция нажимала -xv, а затем восстанавливала предыдущую настройку при возврате. Например.:
function outer(){ echo starting; inner; echo done; }
function inner(){
set -xv
echo inside
set xv
}
outer
Это работает, если параметр в outer установлен по умолчанию; в противном случае он вызывает xv в остальной части внешнего кода. Я могу представить себе какой-нибудь очень грязный скрипт, который анализирует BASHOPTS, но, похоже, должен быть способ получше?
Ответ №1:
Если вам не нужно предоставлять общий доступ к внешней среде кода или изменять переменные outside
изнутри inside
, вы можете запустить подпроцесс с ( inner )
function outer(){ echo starting; inner; echo done; }
function inner(){
(
set -xv
echo inside
)
}
outer
Обратите внимание, что, поскольку вы выполняете в подоболочке, вам не нужно отменять x и v.
Вы также можете просто обернуть вызов inner во outer, не изменяя inner:
function outer(){ echo starting; ( inner ); echo done; }
Здесь вы можете найти более подробную информацию о подоболочках и областях переменных.
https://www.tldp.org/LDP/abs/html/subshells.html
Ответ №2:
локальное сохранение =$-; set -x ... set x -$save
Комментарии:
1. Это не сработает, если
save
содержит какие-либо параметры только для чтения, такие какi
.2. В сценарии оболочки «-i» был удален из $- .
3.
i
это не единственный проблемный символ.