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.
- 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:
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 aSYSTEM
y ejecuta el comandodir
(lista los archivos y directorios en Windows).ADDRESS SYSTEM "ls"
: Cambia el entorno de comandos aSYSTEM
y ejecuta el comandols
(lista los archivos y directorios en Unix/Linux).
- 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 comandodir
y redirige la salida al archivooutput.txt
.DO WHILE LINES('output.txt') > 0
: Lee cada línea del archivooutput.txt
hasta que no queden más líneas.output = output || LINEIN('output.txt') || " "
: Concatenar cada línea leída a la variableoutput
.CALL LINEOUT 'output.txt', ''
: Limpia el contenido del archivooutput.txt
.
- 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 retornoRC
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
- 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. - Lee el archivo y muestra la salida en la consola.
- 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 comandoping
y redirige la salida al archivoping_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 archivoping_output.txt
y la concatena a la variableoutput
.say output
: Muestra la salida del comandoping
.
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.
Curso de Programación REXX
Módulo 1: Introducción a REXX
- ¿Qué es REXX?
- Configuración del Entorno REXX
- Hola Mundo en REXX
- Sintaxis y Estructura Básica
- Variables y Tipos de Datos
Módulo 2: Conceptos Básicos de Programación
- Operadores y Expresiones
- Estructuras de Control: IF/THEN/ELSE
- Bucles: DO y LEAVE
- Entrada y Salida
- Manipulación Básica de Cadenas
Módulo 3: Programación Intermedia en REXX
- Funciones y Subrutinas
- Funciones Integradas
- Manejo de Errores
- Operaciones de Entrada/Salida de Archivos
- Trabajando con Arreglos
Módulo 4: Programación Avanzada en REXX
- Manipulación Avanzada de Cadenas
- Técnicas de Análisis
- Interfaz con Programas Externos
- Macros en REXX
- Optimización del Rendimiento