KornShell - Setze "-x" (Debug) Flag global?

8

Gibt es eine Möglichkeit, den Debug-Modus einzustellen ( set -x ) ) auf einem KornShell (ksh) Skript global? Momentan scheint es so zu sein:

%Vor%

Ich möchte wirklich nur den Befehl set-x an einer Stelle aufrufen müssen.

Hinweis: Dies ist alles in KSH88 unter AIX.

Beispiel:

%Vor% %Vor%     
C. Ross 16.02.2010, 14:16
quelle

5 Antworten

7

Dies ist ksh88 auf einem HP-UX-Computer:

%Vor%

Es ist sicher sieht so aus wie das funktioniert. Ich habe bestätigt, dass es auch mit einem "set -x" vor dem ersten Funktionsaufruf funktioniert.

Ich bin zu einem AIX-System gewechselt und habe das beschriebene Problem festgestellt. Wenn Funktionen in AIX ksh88 entweder als function a { oder a() { definiert sind, scheint die set -x nicht in den funktionslokalen Bereich vorzudringen. Wenn Funktionen, die mit der neuen function a { -Syntax deklariert wurden, auf die gleiche AIX-Box zu ksh93 wechseln, tragen sie auch nicht die äußere set -x in den inneren Bereich. Ksh93 verhält sich jedoch wie POSIX sh (und ksh88 auf anderen Plattformen), die sich verhalten, und führt die Funktion set -x durch die Funktion, wenn die Funktion in der alten Methode a(){ definiert ist. Dies ist wahrscheinlich auf die Rückwärtskompatibilität in ksh93 zurückzuführen, wo versucht wird, das alte Verhalten zu emulieren, wenn Funktionen auf die alte Weise definiert sind.

Daher können Sie den Interpreter für Debugging-Zwecke vorübergehend auf ksh93 umschalten und dann wieder zu ksh88 wechseln, wenn Sie nicht die längeren Arrays, assoziativen Arrays, Fließkomma-Berechnungen, Namespace-Unterstützung und rigoros haben möchten 10x Verbesserung der Ausführungsgeschwindigkeit, die ksh93 bringt. ;) Da es aussieht, als ob die Antwort "Nein, das geht nicht" mit ksh88 unter AIX aussieht. : (

    
dannysauer 16.02.2010, 17:05
quelle
4

Ich habe ein globales set -x mit ksh88 (unter Solaris 10) und ksh93 (Fedora 17) getestet und mit beiden hat ein globaler set -x -Befehl am Anfang des Skripts keinen funktionslokalen Bereich (dh nicht lokale Effekte haben).

Um dieses Problem zu umgehen, können Sie die lokale Befehlstracing für alle Funktionen im Bereich aktivieren (nachdem sie definiert wurden) und bevor sie über typeset :

aufgerufen werden %Vor%

Ausgabe unter ksh88 (Solaris 10):

%Vor%

Satzsatz auskommentiert

%Vor%

Ausgabe unter ksh93 (Fedora 17):

%Vor%

Satzsatz auskommentiert

%Vor%

Ausgabe unter bash

typeset auskommentiert und print durch Echo ersetzt:

%Vor%

(bash 4.2.39 (1) auf Fedora 17)

Gleiche Ausgabe unter zsh 5.0.2 auf Fedora 17.

Fazit

Wenn Sie Ksh verwenden, hat nur bei ksh93 und der% code_% Funktionsdefinitionssyntax eine globale fnname() auch einen lokalen Gültigkeitsbereich. Die set -x -basierte Problemumgehung ist eine relativ einfache Methode, um die Befehlsverfolgung für alle Funktionen zu aktivieren.

In bash (und zsh) funktioniert ein globales typeset -ft wie erwartet, d. h. es hat auch einen lokalen Gültigkeitsbereich für alle Funktionen.

Beim Schreiben neuer Skripte mit bash anstelle von ksh könnte daher die bessere Alternative sein.

Als Randnotiz: bash ist wahrscheinlich noch portabler als ksh88 - besonders portabler als ksh93.

    
maxschlepzig 14.04.2013 20:17
quelle
3

Fügen Sie es Ihrer Shebang-Linie hinzu:

%Vor%

Oder legen Sie es oben in Ihrem Skript fest:

%Vor%

Oder starten Sie Ihr Skript über die Befehlszeile:

%Vor%     
Dennis Williamson 16.02.2010 14:31
quelle
1

Beachten Sie, dass das Scoping zwischen den beiden Arten von Funktionsdeklarationen beeinflusst wird

a () { }

vs.

Funktion a { }

Insbesondere funktioniert das typset unter ksh nicht so, wie Sie es im ersten Fall erwarten würden. Beim Debuggen eines Skripts mit einer rekursiven Funktion gefunden. Mehr hier:

Ссылка

    
JBS 05.08.2011 00:41
quelle
1

Das Verhalten von "set -x" ist eine "Eigenheit" der AIX-Shell (um nicht zu sagen, brain d ...).

Sie haben nach "einer Möglichkeit gefragt, den Debug-Modus ... global einzustellen". Hier ist, was ich tue, um dies zu erreichen:

%Vor%

Um die Ablaufverfolgung zu aktivieren, setzen Sie $set_x in der Umgebung Ihres Skripts auf " set -x ". Um dies auf einer Call-by-Call-Basis zu steuern, setzen Sie den Anruf mit " set_x='set -x' " voran. Da eine Umgebungsvariable verwendet wird, arbeitet diese Methode natürlich mit verschachtelten Aufrufen.

All diese Verwendungen von " $set_x; " sind etwas hässlich, aber es funktioniert mit allen Shells, und der Nutzen überwiegt normalerweise die Kosten.

Ein weiteres Beispiel für eine AIX-Shell "Eigenheit":

%Vor%

Der obige Ausdruck sollte "im Dateibereich eingeschlossen" sein, druckt aber nichts.

    
Rainer 03.02.2012 16:17
quelle