Есть ли чистый, краткий способ добавить / развернуть опции bash verbose и xtrace для функции? - PullRequest
0 голосов
/ 02 апреля 2019

(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

Это работает, если настройка во внешнем является значением по умолчанию;в противном случае он вызывает + xv в остальной части внешнего кода.Я могу представить какой-то очень грязный скрипт, который анализирует BASHOPTS, но кажется, что должен быть лучший способ?

Ответы [ 2 ]

3 голосов
/ 02 апреля 2019

Если вам не нужно совместно использовать среду внешнего кода или изменять переменные из outside в inside, вы можете запустить подпроцесс с помощью ( inner )

function outer(){ echo starting; inner; echo done; }
function inner(){
    (
        set -xv
        echo inside
    )
}
outer

Обратите внимание, что, поскольку вы выполняете в подоболочке, вам не нужно сбрасывать x и v.

Вы также можете просто обернуть вызов к внутреннему в внешний без изменения внутреннего:

function outer(){ echo starting; ( inner ); echo done; }

Вы можете найти больше информации здесь о подоболочках и переменных областях. https://www.tldp.org/LDP/abs/html/subshells.html

0 голосов
/ 02 апреля 2019
  local save=$-; set -x
  ...
  set +x -$save
...