2012-11-02 7 views
48

Czy ktoś wie, czy można powiedzieć, set +x w bash bez niej drukowane:Bash zestaw + x bez niej drukowane

set -x 
command 
set +x 

ślady

+ command 
+ set +x 

ale powinien po prostu wydrukować

+ command 

Bash to wersja 4.1.10 (4). To od pewnego czasu mnie dręczy - dane wyjściowe są zagracone bezużytecznymi liniami set +x, co sprawia, że ​​śledzenie nie jest tak użyteczne, jak mogłoby być.

+0

To nie jest odpowiedź na to pytanie, ale po uruchomieniu skryptu dlaczego nie: 'script.sh 2> & 1 | grep -v 'set + x' ' – cdarke

Odpowiedz

28

Można użyć podpowłoki. Po wyjściu z powłoki w tle, ustawienie do x zostaną utracone:

(set -x ; command) 
+0

Cóż, dziękuję ... dobry punkt. Właściwie to jestem świadomy "podstępnej sztuczki". Miałem nadzieję, że to może być łatwiejsze. Wiąże się to z istotnymi zmianami w kodzie, czyniąc koder złożonym i mniej czytelnym. IMHO, które byłoby gorsze niż życie z liniami set + x ... –

+0

Nie widzę, jak '' (set -x \ n command \ n) 'jest gorsze niż' set -x \ n command \ n set + x'. – chepner

+2

@chepner: Nie można ustawić zmiennych. – choroba

77

miałem ten sam problem, i udało mi się znaleźć rozwiązanie, które nie używają podpowłoce:

set -x 
command 
{ set +x; } 2>/dev/null 
+6

Świetna odpowiedź, tylko uwaga: bez średnika po poleceniu to nie zadziała; i średnikiem, ale bez spacji do nawiasów klamrowych, zostanie zgłoszony błąd składniowy. – sdaau

+5

To zeruje status wyjścia. –

+0

@GarthKidd Status wyjścia jest zerowany przy każdym pomyślnym poleceniu. 'set + x' jest takim udanym poleceniem –

6

I włamał się rozwiązanie to całkiem niedawno, kiedy stałem się zły z nim:

shopt -s expand_aliases 
_xtrace() { 
    case $1 in 
     on) set -x ;; 
     off) set +x ;; 
    esac 
} 
alias xtrace='{ _xtrace $(cat); } 2>/dev/null <<<' 

ta pozwala na włączanie i wyłączanie xtrace jak poniżej, gdzie jestem rejestrowania jak argumenty są assign ed do zmiennych:

xtrace on 
ARG1=$1 
ARG2=$2 
xtrace off 

I masz wyjścia, który wygląda tak:

$ ./script.sh one two 
+ ARG1=one 
+ ARG2=two 
+0

Sprytna sztuczka (choć nie potrzebujesz części'/dev/stdin'). Ograniczeniem jest to, że włączanie rozszerzania aliasów w skryptach może mieć niepożądane skutki uboczne. – mklement0

+0

Masz rację. Zmieniłem odpowiedź, aby usunąć zbędne '/ dev/stdin'. Nie jestem świadomy żadnych konkretnych skutków ubocznych, ponieważ nieinteraktywne środowisko nie powinno ładować żadnych plików definiujących aliasy. Jakie mogą być skutki uboczne? – user108471

+1

To dobra uwaga - zapomniałem, że aliasy nie są dziedziczone, więc ryzyko jest znacznie mniejsze, niż myślałem (hipotetycznie, twój skrypt mógłby być źródłem kodu innej firmy, który zdaje się definiować aliasy, ale zgadzam się, że to prawdopodobnie nie jest prawdziwe - troska o świat). +1 – mklement0

Powiązane problemy