Проверьте текущую многословность bash - PullRequest
0 голосов
/ 03 июня 2018

Я знаю, что bash можно установить в подробный режим с помощью set -v, однако я хочу написать функцию, которая не запускается в подробном режиме, даже если она вызывается из подробного сценария.

Хотя я знаю, что я мог бы отключить многословие, используя set +v в начале функции и заканчивая ее set -v, это означало бы, что моя функция установит любой скрипт, который вызывает ее, даже еслиесли он не был многословным до его вызова.

В идеале я бы проверил уровень многословия в начале функции, отключил бы многословие и вернул бы изменение многословия в конце функции.

Есть ли способ найти текущий уровень детализации?

Ответы [ 4 ]

0 голосов
/ 03 июня 2018
if test -o verbose; then
   echo 'shell is running in verbose mode'
else
   echo 'shell is not running in verbose mode'
fi

или, что эквивалентно,

if [[ -o verbose ]]; then
   echo 'shell is running in verbose mode'
else
   echo 'shell is not running in verbose mode'
fi

Встроенная утилита test в bash способна проверить, установлена ​​опция оболочки или нет, используя -o OPTION.Смотрите help test в интерактивной оболочке bash или читайте о ней в руководстве bash.

Ваша функция может выглядеть как

foo () {
    if [[ -o verbose ]]; then
        set +v
        trap 'set -v' RETURN
    fi

    # do stuff
}

Это определяет, является ли -vактивен при вызове функции.Если это так, он отключается и устанавливается ловушка RETURN, которая снова включит его, когда функция вернется (в конце функции или с помощью явного оператора return).

0 голосов
/ 03 июня 2018

Проверка опции подробного режима аналогична проверке любой другой опции bash, см. В bash, как получить текущий статус set -x? .

Попробуйте это:

func() {
   local old_verbosity_level=${-//[^v]}
   set +v
   ...
   if [ -n "$old_verbosity_level" ]; then set -v; else set +v; fi
}

или более хитрый:

func() {
   local old_verbosity_level=${-//[^v]}
   set +v
   ...
   ${old_verbosity_level:+set -v}
}
0 голосов
/ 03 июня 2018

В зависимости от вашей функции и ее использования, вы можете просто ограничить область изменения опций с помощью (..) subshell:

foo() (
  set +vx
  echo "not verbose"
)

set -v
foo
echo "still verbose"
0 голосов
/ 03 июня 2018
if [[ $- =~ v ]]; then 
  echo "verbose enabled"
else
  echo "verbose disabled"
fi

$-: Содержит текущий набор включенных опций.Смотри: help set

...