En este módulo, aprenderemos cómo REXX puede interactuar con programas externos. Esta capacidad es crucial para ampliar las funcionalidades de nuestros scripts y permitir la integración con otros sistemas y aplicaciones.

Objetivos del Módulo

  • Comprender cómo ejecutar programas externos desde un script REXX.
  • Aprender a capturar la salida de programas externos.
  • Manejar errores y excepciones al interactuar con programas externos.

  1. Ejecución de Programas Externos

1.1. Uso del Comando ADDRESS

En REXX, el comando ADDRESS se utiliza para cambiar el entorno de comando y ejecutar programas externos. La sintaxis básica es:

ADDRESS [entorno] [comando]

Ejemplo Práctico

Supongamos que queremos ejecutar un comando del sistema operativo, como dir en Windows o ls en Unix/Linux, desde un script REXX.

/* Script REXX para ejecutar un comando externo */
say "Ejecutando comando externo..."

/* Cambiar al entorno de comandos del sistema */
ADDRESS SYSTEM "dir" /* En Windows */
-- o --
ADDRESS SYSTEM "ls"  /* En Unix/Linux */

say "Comando ejecutado."

Explicación del Código

  • ADDRESS SYSTEM "dir": Cambia el entorno de comandos a SYSTEM y ejecuta el comando dir (lista los archivos y directorios en Windows).
  • ADDRESS SYSTEM "ls": Cambia el entorno de comandos a SYSTEM y ejecuta el comando ls (lista los archivos y directorios en Unix/Linux).

  1. Captura de la Salida de Programas Externos

Para capturar la salida de un programa externo, podemos redirigir la salida a un archivo y luego leer ese archivo desde nuestro script REXX.

Ejemplo Práctico

/* Script REXX para capturar la salida de un comando externo */
say "Capturando salida de comando externo..."

ADDRESS SYSTEM "dir > output.txt" /* En Windows */
-- o --
ADDRESS SYSTEM "ls > output.txt"  /* En Unix/Linux */

/* Leer el archivo de salida */
output = ""
DO WHILE LINES('output.txt') > 0
    output = output || LINEIN('output.txt') || " "
END

say "Salida del comando:"
say output

/* Limpiar el archivo de salida */
CALL LINEOUT 'output.txt', ''

Explicación del Código

  • ADDRESS SYSTEM "dir > output.txt": Ejecuta el comando dir y redirige la salida al archivo output.txt.
  • DO WHILE LINES('output.txt') > 0: Lee cada línea del archivo output.txt hasta que no queden más líneas.
  • output = output || LINEIN('output.txt') || " ": Concatenar cada línea leída a la variable output.
  • CALL LINEOUT 'output.txt', '': Limpia el contenido del archivo output.txt.

  1. Manejo de Errores

Es importante manejar posibles errores al interactuar con programas externos. Podemos utilizar la función RC (Return Code) para verificar el estado de la ejecución del comando.

Ejemplo Práctico

/* Script REXX con manejo de errores */
say "Ejecutando comando externo con manejo de errores..."

ADDRESS SYSTEM "dir > output.txt" /* En Windows */
-- o --
ADDRESS SYSTEM "ls > output.txt"  /* En Unix/Linux */

IF RC \= 0 THEN DO
    say "Error al ejecutar el comando. Código de retorno:" RC
    EXIT RC
END

/* Leer el archivo de salida */
output = ""
DO WHILE LINES('output.txt') > 0
    output = output || LINEIN('output.txt') || " "
END

say "Salida del comando:"
say output

/* Limpiar el archivo de salida */
CALL LINEOUT 'output.txt', ''

Explicación del Código

  • IF RC \= 0 THEN DO: Verifica si el código de retorno RC es diferente de 0, lo que indica un error.
  • say "Error al ejecutar el comando. Código de retorno:" RC: Muestra un mensaje de error con el código de retorno.
  • EXIT RC: Termina el script con el código de retorno del error.

Ejercicio Práctico

Ejercicio 1: Ejecutar y Capturar la Salida de un Comando Externo

  1. Escribe un script REXX que ejecute el comando ping a una dirección IP (por ejemplo, 8.8.8.8) y capture la salida en un archivo.
  2. Lee el archivo y muestra la salida en la consola.
  3. Maneja posibles errores durante la ejecución del comando.

Solución

/* Script REXX para ejecutar y capturar la salida de un comando ping */
say "Ejecutando comando ping..."

ADDRESS SYSTEM "ping 8.8.8.8 > ping_output.txt"

IF RC \= 0 THEN DO
    say "Error al ejecutar el comando ping. Código de retorno:" RC
    EXIT RC
END

/* Leer el archivo de salida */
output = ""
DO WHILE LINES('ping_output.txt') > 0
    output = output || LINEIN('ping_output.txt') || " "
END

say "Salida del comando ping:"
say output

/* Limpiar el archivo de salida */
CALL LINEOUT 'ping_output.txt', ''

Explicación del Código

  • ADDRESS SYSTEM "ping 8.8.8.8 > ping_output.txt": Ejecuta el comando ping y redirige la salida al archivo ping_output.txt.
  • IF RC \= 0 THEN DO: Verifica si hubo un error al ejecutar el comando.
  • DO WHILE LINES('ping_output.txt') > 0: Lee cada línea del archivo ping_output.txt y la concatena a la variable output.
  • say output: Muestra la salida del comando ping.

Conclusión

En este módulo, hemos aprendido cómo REXX puede interactuar con programas externos utilizando el comando ADDRESS. Hemos visto cómo ejecutar comandos del sistema, capturar su salida y manejar errores. Estas habilidades son esenciales para ampliar las capacidades de nuestros scripts REXX y permitir la integración con otros sistemas y aplicaciones.

En el próximo módulo, exploraremos la manipulación avanzada de cadenas en REXX, lo que nos permitirá trabajar con datos de texto de manera más eficiente y efectiva.

© Copyright 2024. Todos los derechos reservados