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

(Линукс Баш 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, но, похоже, должен быть лучший способ?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
251
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вам не нужно совместно использовать среду внешнего кода или изменять переменные из 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

Это не сработает, если save содержит параметры только для чтения, такие как i.

chepner 02.04.2019 20:42

В сценарии оболочки "-i" удалено из $-.

Mischa 03.08.2019 01:20
i не единственный проблемный персонаж.
chepner 03.08.2019 17:19

Другие вопросы по теме