есть ли чистый, лаконичный способ использовать подробные параметры bash и xtrace для функции?

#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 это не единственный проблемный символ.