Wiem, że bash może być ustawiony na tryb podawany za pomocą set -v, jednak chcę napisać funkcję, która nie uruchamiana w trybie Verbose, nawet jeśli zostanie wywołany z werbowanym skryptem.

Chociaż jestem świadomy, że mógłbym wyłączyć doskonałość, używając set +v na początku funkcji i zakończ go za pomocą set -v, oznaczałoby to, że moja funkcja ustawi dowolny skrypt, który wywołuje go do podawania, nawet jeśli to nie był gadany przed wezwaniem.

Idealnie sprawdziłbym poziom gazu na początku funkcji, wyłącz gadatość i przywrócić zmianę gadatliwości na końcu funkcji.

Czy istnieje sposób na znalezienie poziomu gazu aktualnego?

2
stav meir 3 czerwiec 2018, 13:51

4 odpowiedzi

Najlepsza odpowiedź
if [[ $- =~ v ]]; then 
  echo "verbose enabled"
else
  echo "verbose disabled"
fi

$-: Zawiera bieżący zestaw włączonych opcji. Zobacz: help set

3
Cyrus 3 czerwiec 2018, 12:06
if test -o verbose; then
   echo 'shell is running in verbose mode'
else
   echo 'shell is not running in verbose mode'
fi

Lub, równoważnie,

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

Wbudowany test Narzędzie w bash jest w stanie przetestować, czy opcja powłoki jest ustawiona lub nie używa -o OPTION. Patrz help test w interaktywnym powłokę {x4}} lub czytaj o tym, jest bash Manual.

Twoja funkcja może wyglądać

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

    # do stuff
}

Wykrywa to, czy -v jest aktywny, gdy funkcja zostanie wywołana. Jeśli jest to wyłączony, a zainstalowany jest {{X1} Trap.

1
Kusalananda 9 czerwiec 2018, 06:50

Sprawdzanie opcji trybu Verbose jest taka sama jak sprawdzać dowolną inną opcję bash, patrz w bash, jak uzyskać bieżący stan ustawienia -x?.

Spróbuj tego:

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

Lub bardziej trudne:

func() {
   local old_verbosity_level=${-//[^v]}
   set +v
   ...
   ${old_verbosity_level:+set -v}
}
0
KamilCuk 3 czerwiec 2018, 11:26

W zależności od funkcji i jej użycia można ograniczyć zakres opcji zmienia się w Subshell (..):

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

set -v
foo
echo "still verbose"
0
that other guy 3 czerwiec 2018, 15:06