Obtenga la última línea de comando ejecutada en ksh

Obtenga la última línea de comando ejecutada en ksh

¿Hay alguna manera de obtener el último comando ejecutado junto con los argumentos dentro de un script ksh? Estoy usando mksh con cygwin.

Lo intenté fc -nl -1, pero el script arroja un error ""fc: funciones de historial no disponibles".

No veo un equivalente de la BASH_COMMANDvariable en ksh.

Aquí está el extracto del guión:

function trapper ()
{
  printf "culprit: "
  fc -nl -1
}

trap trapper ERR

grep -ic textdoesntexist test3

trapper se ejecuta una vez que grep devuelve 1, pero aparece un error fc: funciones históricas no disponibles.

Comoseñalado por LeehistPuede ser útil, pero lo es .disponible solo con ksh93, que no tengo permitido usar.

Intenté almacenar la cadena de la línea de comando en una variable y usar esa variable dentro de la función trampero.

function err_handler
{
        echo "ERR in ${cmd} trapped"
        cmd=
        return 0
}

trap err_handler EXIT ERR

cmd="grep -ic testdoesntexist test3"
${cmd} &>/dev/null

Funciona, pero creo que es feo. ¿Existe una mejor salida?

Respuesta1

mkshautor aquí ☻

La fcutilidad incorporada accede al historial interactivo de la línea de comandos. Como ya habrás adivinado por el nombre, esto no está disponible para scripts, ya que se analizan de manera diferente (mucho más eficiente).

En términos generales, en un guión, puedessiempreconoce la última línea, de todos modos;)

Si necesita acceder al historial de un shell interactivo, defina un alias o, preferiblemente, una función en .profileo .mkshrc.

En su caso específico, sugiero utilizar un manejo de errores explícito, algo como:

grep -ic textdoesntexist test3 || die 'Could not grep in test3'

Ypor favor en realidadevite utilizar el modismo de compatibilidad de GNU bash &>como operador de redirección; solo está ahí por compatibilidad, no por secuencias de comandos nuevas, y ya desaparece en -o posixmodo. Analizarlo puede romper los scripts POSIX válidos existentes.

información relacionada