set -xv-Verhalten in KSH vs. Bash

set -xv-Verhalten in KSH vs. Bash

Normalerweise möchte ich, dass die gesamte Debug-Ausgabe eines Skripts in einer Datei gespeichert wird. Ich verwende also etwas wie:

exec 2> somefile
set -xv

Dies funktioniert in Bash sehr gut, aber ich habe festgestellt, dass es sich in KSH bei Funktionen anders verhält. Mir ist aufgefallen, dass die Ausgabe, wenn ich dies in KSH mache, nicht die Funktionsverfolgung anzeigt, sondern nur, dass die Funktion aufgerufen wurde.

Bei einigen zusätzlichen Tests ist mir aufgefallen, dass das Verhalten auch von der Deklaration der Funktion abhängt, wenn ich die folgende KSH-Syntax verwende:

function doSometime {....}

Ich sehe nur den Funktionsaufruf. Wenn ich die Funktion jedoch mit der anderen Methode deklariere, z. B.

doSomething() {....}

Die Ablaufverfolgung funktioniert wie erwartet. Ist es möglich, set -xvmit beiden Arten von Funktionsdeklarationen dasselbe Ergebnis zu erzielen? Ich habe es versucht, export SHELLOPTSaber auch das hat keinen Unterschied gemacht.

Ich verwende ksh93 unter Solaris 11.

Antwort1

Aus der Dokumentation:

Funktionen definiert durchFunktion NameSyntax und Aufruf nach Namen werden im selben Prozess wie der Anrufer ausgeführt und geben alle Dateien und das aktuelle Arbeitsverzeichnis an den Anrufer weiter. Vom Anrufer abgefangene Traps werden innerhalb der Funktion auf ihre Standardaktion zurückgesetzt.

Wohingegen

Funktionen, die mit demName()-Syntax und Funktionen, die mit der Funktionsnamensyntax definiert sind und mit dem speziellen integrierten Befehl . aufgerufen werden, werden in der Umgebung des Anrufers ausgeführt undTeilen Sie alle Variablen und Traps mit dem Anrufer.

Die Lösung besteht darin, das Schlüsselwort nicht zu verwenden functionund bei der Standardform der Funktionsdefinitionen zu bleiben.

Wenn Sie alternativ nur an einigen Funktionen interessiert sind, typeset -tf fnamewird nur die Funktion verfolgt fname(sofern sie mit dem Schlüsselwort definiert wurde function).

So stoppen Sie die Ablaufverfolgung:typeset +tf fname

So verfolgen Sie alle diese Funktionen in ksh93:typeset -tf $(typeset +f)

So sehen Sie, welche Funktionen verfolgt werden:typeset +tf

So beenden Sie die Verfolgung aller Funktionen:typeset +tf $(typeset +tf)

verwandte Informationen