2013-05-17 14 views
14

Dokonując złożonych skryptów bash, będę często używać polecenia:w Bashu możesz ustawić -x, aby włączyć debugowanie, czy jest jakiś sposób sprawdzenia, czy zostało to ustawione w skrypcie?

set -x

włączyć mnie do debugowania skryptu, jeśli nie zachowuje.

Jednak mam pewne funkcje interfejsu użytkownika, które wytwarzają duże ilości śmieci w trybie debugowania, więc chciałbym zawinąć je w warunkowa wzdłuż linii:

ui~title(){ 
    DEBUG_MODE=0 
    if [ set -x is enabled ] # this is the bit I don't know how to do 
    then 
     # disable debugging mode for this function as it is not required and generates a lot of noise 
     set +x 
     DEBUG_MODE=1 
    fi 

    # my UI code goes here 

    if [ "1" == "$DEBUG_MODE" ] 
    then 
     # re enable debugging mode here 
     set -x 
    fi 
} 

Problem polega na tym, że nie mogę dowiedzieć się, jak sprawdzić, czy tryb debugowania jest włączony, czy nie.

Zakładam, że to możliwe, po prostu nie mogę tego znaleźć pomimo wielu poszukiwań.

Dzięki z góry za wszelkie wskazówki

+0

dwie wielkie odpowiedzi, na zdrowie! – edmondscommerce

Odpowiedz

23

użyć następujących:

if [[ "$-" == *x* ]]; then 
    echo "is set" 
else 
    echo "is not set" 
fi 

Od 3.2.5. Special parameters:

Myślnik rozszerza bieżące flagi opcji, takie jakie zostały podane podczas wywołania, przez wbudowane polecenie set lub ustawione przez samą powłokę (np. -i).

+4

+1. Może być dobry, aby zilustrować, czym właściwie jest "$ -" –

9
$ [ -o xtrace ] ; echo $? 
1 
$ set -x 
++ ... 
$ [ -o xtrace ] ; echo $? 
+ '[' -o xtrace ']' 
+ echo 0 
0 
+0

Dzięki za dokładną odpowiedź –

1

Tylko dla kompletności wywodu, tutaj są dwie funkcje wielokrotnego użytku: przykład

is_shell_attribute_set() { # attribute, like "x" 
    case "$-" in 
    *"$1"*) return 0 ;; 
    *) return 1 ;; 
    esac 
} 


is_shell_option_set() { # option, like "pipefail" 
    case "$(set -o | grep "$1")" in 
    *on) return 0 ;; 
    *) return 1 ;; 
    esac 
} 

Zastosowanie:

set -x 
if is_shell_attribute_set e; then echo "yes"; else echo "no"; fi # yes 

set +x 
if is_shell_attribute_set e; then echo "yes"; else echo "no"; fi # no 

set -o pipefail 
if is_shell_option_set pipefail; then echo "yes"; else echo "no"; fi # no 

set +o pipefail 
if is_shell_option_set pipefail; then echo "yes"; else echo "no"; fi # no