¿Comando Bash "script" dentro de archivos bash?

¿Comando Bash "script" dentro de archivos bash?

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.txten el primero del myscriptarchivo 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.txten el primero del myscriptarchivo 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.txtes solo un comando que ejecuta un ejecutable externo. El ejecutable es scripten este caso.

Si el ejecutable fuera sleep, taro ls, esperaría que el shell esperara hasta que finalice el ejecutable antes de interpretar el resto de myscript. Con scriptesto no es diferente: el caparazón espera scriptterminar.

scriptestá diseñado para uso interactivo. script ~/script.txtejecuta un shell interactivo que no es el shell que interpreta myscript. Escribiste "la ventana se cierra" (cuando no está script), así que supongo que myscriptse ejecuta en algún emulador de terminal que muestra una ventana. Si es así, entonces (con script) probablemente viste este caparazón interno iniciado scripty pudiste interactuar con él mientras el caparazón externo esperaba. scriptregistra lo que haces en el caparazón interno. La salida de la capa interior termina scripty 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 scriptque llamar desde dentro myscriptno puede ayudarle con la depuración myscript, incluso si el caparazón externo continúa.

Hay al menos dos métodos para depurar myscript:

  1. 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 myscriptgenera 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 myscriptse ejecuta sin terminal.

  2. 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 si myscriptle sucede a exitél killmismo o execa otro ejecutable, nunca llegará a la línea con bash; tómalo en consideración.

    Si por alguna razón el interactivo bashiniciado desde el script borra la terminal o algo así, utilícelo sleep 3600en 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 myscriptpara que el shell que lo interprete imprima comandos y argumentos a medida que se ejecutan. Esto debería brindarle información útil.

información relacionada