
Tengo un script bash, /usr/bin/local/myscript. Normalmente ejecuto el archivo desde un software externo (en mi caso, Autohotkey), básicamente quiero decir que el script finalizará inmediatamente y la ventana se cerrará, por lo que no puedo ver ningún registro en la ventana, registros de información o registros de errores. Por eso me gusta crear un script de todos los pasos en ejecución para depurar cuando el programa no funcionó bien. Pero simplemente poner un script ~/script.txt
en el primero del myscript
archivo no funcionó, no sé qué está pasando, las siguientes líneas del archivo básicamente no se ejecutaron. Entonces, ¿existe una forma (adecuada) de utilizar "script" en archivos bash, o una mejor alternativa a "script" para esto?
Respuesta1
Pero simplemente poner un
script ~/script.txt
en el primero delmyscript
archivo no funcionó, no sé qué está pasando, las siguientes líneas del archivo básicamente no se ejecutaron.
Para una interpretación de shell myscript
, script ~/script.txt
es solo un comando que ejecuta un ejecutable externo. El ejecutable es script
en este caso.
Si el ejecutable fuera sleep
, tar
o ls
, esperaría que el shell esperara hasta que finalice el ejecutable antes de interpretar el resto de myscript
. Con script
esto no es diferente: el caparazón espera script
terminar.
script
está diseñado para uso interactivo. script ~/script.txt
ejecuta un shell interactivo que no es el shell que interpreta myscript
. Escribiste "la ventana se cierra" (cuando no está script
), así que supongo que myscript
se ejecuta en algún emulador de terminal que muestra una ventana. Si es así, entonces (con script
) probablemente viste este caparazón interno iniciado script
y pudiste interactuar con él mientras el caparazón externo esperaba. script
registra lo que haces en el caparazón interno. La salida de la capa interior termina script
y sólo entonces la capa exterior (es decir, myscript
) continúa. Pero tal vez cerraste el emulador de terminal, la capa exterior obtuvo SIGHUP y nunca continuó.
Esto no es importante ya que ahora debería quedar claro script
que llamar desde dentro myscript
no puede ayudarle con la depuración myscript
, incluso si el caparazón externo continúa.
Hay al menos dos métodos para depurar myscript
:
Redirige stderr del script a un archivo de registro. Esto se puede hacer desde el script con
# just after shebang exec 2>/path/to/logfile
Si
myscript
genera una salida en su salida estándar que es importante y realmente va a algún lugar (a través de una tubería o redirección), entonces no querrás romper esto. Pero si normalmente se imprime en la terminal y desea registrar esto también, redirija tanto stderr como stdout al archivo de registro:# just after shebang exec 2>/path/to/logfile 1>&2
Este método funcionará incluso si
myscript
se ejecuta sin terminal.Alternativamente, deje que el script ejecute un shell interactivo (p. ej.
bash
) al final. El nuevo shell evitará que la ventana se cierre y podrá ver lo que el script ha impreso en la terminal hasta el momento. Obviamente esto requiere una terminal. Tenga en cuenta que simyscript
le sucede aexit
élkill
mismo oexec
a otro ejecutable, nunca llegará a la línea conbash
; tómalo en consideración.Si por alguna razón el interactivo
bash
iniciado desde el script borra la terminal o algo así, utilícelosleep 3600
en su lugar. El punto es que realmente no necesitas un shell adicional, necesitas cualquier proceso que mantenga abierto el emulador de terminal el tiempo suficiente para que puedas examinar el resultado anterior.
No importa el método que elijas, coloca
set -x
desde el principio myscript
para que el shell que lo interprete imprima comandos y argumentos a medida que se ejecutan. Esto debería brindarle información útil.