establecer -xv comportamiento en ksh vs bash

establecer -xv comportamiento en ksh vs bash

Normalmente me gusta que toda la salida de depuración de un script vaya a un archivo, por lo que tendré algo como:

exec 2> somefile
set -xv

Esto funcionará muy bien en bash, pero he notado que en ksh se comporta de manera diferente cuando se trata de funciones. Noté que cuando hago esto en ksh, la salida no muestra el seguimiento de la función, solo que se llamó a la función.

Al realizar algunas pruebas adicionales, noté que el comportamiento también depende de cómo se declaró la función, si uso la sintaxis ksh de:

function doSometime {....}

Todo lo que veo es la llamada a la función, sin embargo, si declaro la función usando el otro método, por ejemplo

doSomething() {....}

El rastreo funciona como se esperaba. ¿Es posible empezar set -xva trabajar igual con ambos tipos de declaraciones de funciones? Lo intenté export SHELLOPTSy eso tampoco hizo la diferencia.

Estoy usando ksh93 en Solaris 11.

Respuesta1

De la documentación:

Funciones definidas por elfunción nombresintaxis y llamado por nombre se ejecuta en el mismo proceso que la persona que llama y comparte todos los archivos y el directorio de trabajo actual con la persona que llama. Las trampas detectadas por la persona que llama se restablecen a su acción predeterminada dentro de la función.

Mientras

Funciones definidas con elnombre() sintaxis y funciones definidas con la sintaxis del nombre de función que se invocan con el archivo . Las funciones integradas especiales se ejecutan en el entorno de la persona que llama ycomparta todas las variables y trampas con la persona que llama.

La solución es no utilizar la functionpalabra clave; apéguese a la forma estándar de definiciones de funciones.

Alternativamente, si solo está interesado en algunas funciones, typeset -tf fnamesimplemente rastreará la función fname(si se definió con la functionpalabra clave).

Para detener el rastreo:typeset +tf fname

Para rastrear todas estas funciones en ksh93:typeset -tf $(typeset +f)

Para ver qué funciones se rastrean:typeset +tf

Para dejar de rastrear todas las funciones:typeset +tf $(typeset +tf)

información relacionada