KornShell - Set "-x" (debug) flag Global?
Gibt es eine Möglichkeit zum festlegen der debug-Modus(set-x) auf eine KornShell (ksh), Skript, weltweit? Derzeit scheint es, habe ich etwas wie die folgende:
a(){
set -x
#commands
}
b(){
set -x
#more commands
}
set-x
a
#commands
b
Ich würde wirklich gerne, nur haben Sie zum aufrufen der set-x-Befehl in einer Stelle.
Hinweis: Das ist alles in KSH88 auf AIX.
Beispiel:
#!/bin/ksh
set -x
a(){
echo "This is A!"
}
b(){
echo "This is B!"
}
a
echo "Outside"
b
dev2:/home/me-> ./testSetX + ein Dies ist Eine! + echo Außerhalb Außerhalb + b Das ist B! dev2:/home/me->
- Das ist komisch. Ich habe auch gerade versucht, es in ksh88 (und ksh93) auf einem meiner AIX-Systemen, und bekomme ich das benehmen beschrieben. Aber der ksh88 auf meiner HP-UX-Systemen arbeiten, wie Sie wollen. Ich veränderte meine Antwort und reflektieren die Ergebnisse.
- fyi, ksh88
/usr/bin/ksh
auf Solaris 10 zeigt auch das beschriebene Verhalten (keine Globale Wirkungset -x
).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ksh88 auf einem HP-UX-Maschine:
Es sicher sieht wie das funktioniert. Ich habe überprüft, dass es funktioniert auch mit einem "set-x" irgendwo vor dem ersten Aufruf der Funktion.
Zog ich auf einem AIX-system, und erfahren das problem, das Sie beschrieben. Wenn-Funktionen sind definiert als entweder
function a {
odera() {
in AIX ksh88, dieset -x
scheint nicht nach vorne tragen Sie in die function-local-Bereich. Der Wechsel zu ksh93 auf der gleichen AIX-box, Funktionen deklariert, mit der neuenfunction a {
syntax auch nicht tragen, die äußerenset -x
in den inneren Bereich. Allerdings ksh93 verhält sich wie eine POSIX-sh (und ksh88 auf anderen Plattformen) verwendet, um Verhalten, tragen derset -x
durch die Funktion wenn die Funktion definiert ist, in der altena(){
Methode. Dies ist wahrscheinlich auf die rückwärts-Kompatibilität in ksh93, wo es versucht zu emulieren, die das alte Verhalten, als Funktionen definiert sind die alten Weg.Daher, Sie könnten in der Lage sein, um vorübergehend schalten Sie die Dolmetscherin über ksh93 für debugging-Zwecke, und wechseln Sie dann wieder in ksh88, wenn Sie mögen es nicht, wenn die mehr-arrays, assoziative arrays, floating point math-namespace-Unterstützung, und rougly 10x Verbesserungen in der Ausführungsgeschwindigkeit, die ksh93 bringt. 😉 Denn wie es aussieht, ist die Antwort "Nein, Sie können nicht tun," mit ksh88 auf AIX. 🙁
Fügen Sie es zu Ihrem shebang Zeile:
Oder legen Sie es oben in Ihrem Skript:
Oder starten Sie Ihr Skript von der Kommandozeile aus:
Getestet habe ich eine Globale
set -x
mit ksh88 (Solaris 10) und ksh93 (Fedora 17) und mit einem globalenset -x
Befehl an den Anfang des Skripts nicht haben Funktion-lokaler Bereich (d.h. Sie besitzt keine lokale Wirkung).Als Problemumgehung können Sie aktivieren lokale Befehl Ablaufverfolgung für alle Funktionen, die in Umfang (nachdem Sie definiert ist) und bevor Sie aufgerufen sind, über
typeset
:Ausgabe unter ksh88 (Solaris 10):
Satz auskommentiert
Ausgabe unter ksh93 (Fedora 17):
Satz auskommentiert
Ausgabe unter bash
typeset
auskommentiert undprint
ersetzt die mit echo:(bash 4.2.39(1) auf Fedora 17)
Gleichen Ausgabe unter der zsh 5.0.2 auf Fedora 17.
Abschluss
Bei der Verwendung von Ksh, nur mit ksh93 und die
fnname()
function definition syntax einer globalenset -x
hat auch im lokalen Bereich. Dietypeset -ft
basierten workaround ist eine relativ leichte Art und Weise zu aktivieren-Befehl die Ablaufverfolgung für alle Funktionen.In der bash (und zsh) eine Globale
set -x
wie erwartet funktioniert, d.h. es hat auch im lokalen Bereich für alle Funktionen.So, beim schreiben neuer Skripte mit bash statt ksh wäre die bessere alternative, weil dieser.
Als Anmerkung: die bash ist wahrscheinlich sogar noch mehr tragbar als ksh88 - vor allem mehr tragbar als ksh93.
Bewusst sein, dass der Erfassungsbereich beeinflusst wird zwischen zwei Arten von Deklarationen
a() {
}
vs.
Funktion a {
}
Insbesondere die typset unter ksh funktioniert nicht, wie man erwarten würde im ersten Fall. Finden Sie heraus, während Sie versuchen, ein Skript zu Debuggen, die mit einer rekursiven Funktion. Mehr hier:
http://www.dartmouth.edu/~rc/classes/ksh/functions.html
Das Verhalten von "set -x" ist eine "Besonderheit" der AIX shell (um nicht zu sagen Gehirn d...).
Sie bat um "eine Möglichkeit zum festlegen der debug-Modus... weltweit".
Hier ist, was ich tun, um dies zu erreichen:
Um die Ablaufverfolgung aktivieren, setzen
$set_x
in der Umgebung für Ihr Skript zu "set -x
".Zur Steuerung dieses auf einer call-by-call-basis, Präfix, wird der Anruf mit "
set_x='set -x'
".Da eine Umgebungsvariable verwendet wird, ist diese Methode natürlich funktioniert auch mit verschachtelten Aufrufe.
Alle diese Verwendungen von "
$set_x;
" sind ein bisschen hässlich, aber es funktioniert mit allen Schalen,und der nutzen in der Regel überwiegt die Kosten.
Ein weiteres Beispiel für eine AIX shell "Besonderheit":
Den oben genannten drucken "gefangen im Datei-Bereich", aber druckt nichts.