• Publicidad

Emular comandos Linux con Perl

¿Eres administrador de sistemas? Este foro es para todos aquellos temas relacionados con el uso de Perl para administración de sistemas.

Emular comandos Linux con Perl

Notapor gerkrt » 2011-01-27 18:20 @806

Buenas, quería probar ahora a hacer que mi script de copias de seguridad funcione digamos, de forma típica, y compatible con la consola de Linux.

Es decir, que por ejemplo, genero un return válido que se pueda ver con un pipe u otro comando. O sea, sé lo del 0 es bien y 1 mal, pero lo demás...

Otra cosa es recibir pipes en tu mismo programa, o tratar con las opciones de los atributos en plan Linux, o sea: -l, -v, etc.
gerkrt
Perlero nuevo
Perlero nuevo
 
Mensajes: 33
Registrado: 2010-11-22 21:43 @946

Publicidad

Re: Emular comandos Linux con Perl

Notapor explorer » 2011-01-27 18:39 @818

Si quieres interactuar con otros programas, lo normal es usar las tuberías, intercambiando la información a través de la entrada y la salida estándar.

Y para el procesado de las opciones pasadas al programa, aunque siempre es recomendable usar alguno de los módulos de gestión de parámetros, con la opción '-s' de perl puedes hacer alguna pequeña interpretación de los mismos.

Voy a ponerte un ejemplo para estos dos casos.

Supongamos un fichero de texto
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
3474
4387543985 JF
34975 XS
048434 jj
2343
5345 JTA
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Y el siguiente programa
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -s
  2.  
  3. our $x;
  4.  
  5. while (<>) {
  6.  
  7.     if ($x) {
  8.         chomp;
  9.         print qq("$_"\n);
  10.     }
  11.     else {
  12.         print $_;
  13.     }
  14. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Destacamos:
* la opción '-s' en la primera fila, para indicar que procese los argumentos que empiecen por '-'
* declaramos una variable global $x
* hacemos un bucle por la entrada estándar '<>', es decir, si no indicamos nada, el operador diamante se refiere a la entrada que el usuario haya elegido
* según el valor de $x, el programa hará una cosa distinta con cada línea leída por la entrada estándar

Ejemplo de uso.
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@casa:~/Documentos/Desarrollo> ./kk.pl kk.txt
3474
4387543985 JF
34975 XS
048434 jj
2343
5345 JTA
explorer@casa:~/Documentos/Desarrollo> ./kk.pl -x kk.txt
"3474"
"4387543985 JF"
"34975 XS"
"048434 jj"
"2343"
"5345 JTA"
explorer@casa:~/Documentos/Desarrollo> cat kk.txt | ./kk.pl
3474
4387543985 JF
34975 XS
048434 jj
2343
5345 JTA
explorer@casa:~/Documentos/Desarrollo> cat kk.txt | ./kk.pl -x
"3474"
"4387543985 JF"
"34975 XS"
"048434 jj"
"2343"
"5345 JTA"
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Como ves, las salidas son distintas según esté presente la opción '-x', y admitimos, tanto el procesado de un fichero indicado como argumento, como un flujo de líneas entubadas desde otro comando.

Más información en perldoc perlrun.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Emular comandos Linux con Perl

Notapor gerkrt » 2011-01-28 11:29 @520

Gracias, ¿me podrías indicar cuáles son los módulos de gestión de parámetros?
gerkrt
Perlero nuevo
Perlero nuevo
 
Mensajes: 33
Registrado: 2010-11-22 21:43 @946

Re: Emular comandos Linux con Perl

Notapor explorer » 2011-01-28 11:48 @533

Cualquiera de la familia Getopt.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Emular comandos Linux con Perl

Notapor gerkrt » 2011-02-08 18:09 @798

Gracias, era lo que buscaba.
gerkrt
Perlero nuevo
Perlero nuevo
 
Mensajes: 33
Registrado: 2010-11-22 21:43 @946

Re: Emular comandos Linux con Perl

Notapor gerkrt » 2011-02-16 06:12 @300

Ahora estaba pensando en cómo puedo hacer para que un script tenga un valor de retorno válido para Linux u otras cosas.

Ya que mi script copia una serie de entradas con X archivos, devolvería la información del total de archivos y entradas copiadas.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
return "Entradas copiadas:\t$cont\nTotal archivos:\t$total_arxius";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Pero esto sería válido para lo que he dicho?
gerkrt
Perlero nuevo
Perlero nuevo
 
Mensajes: 33
Registrado: 2010-11-22 21:43 @946

Re: Emular comandos Linux con Perl

Notapor explorer » 2011-02-16 06:47 @324

Un programa suele dar varias salidas.

Está la salida de estado (que se almacenará en la variable de estado $?) que indicará si el resultado de la operación ha sido correcto o no. Los valores normales son 0: todo ha ido bien. <>0: algo ha ido mal. Ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. explorer@aprosi21:~/Documents/Desarrollo> ls -l
  2. total 100
  3. drwxr-xr-x 2 explorer users  4096 nov 11  2009 cfg
  4. -rwxr-xr-x 1 explorer users   823 nov  9  2009 code_19658.pl
  5. -rwxr-xr-x 1 explorer users   823 nov  9  2009 code_19658.pl~
  6. -rw-r--r-- 1 explorer users  8048 abr 14  2010 code_21685_1.txt
  7. -rwxr-xr-x 1 explorer users   746 abr 14  2010 code_21685.pl
  8. -rwxr-xr-x 1 explorer users   543 abr 14  2010 code_21685.pl~
  9. -rwxr-xr-x 1 explorer users  1487 nov  8 20:15 code_23444.pl
  10. -rwxr-xr-x 1 explorer users  1545 nov  8 20:01 code_23444.pl~
  11. explorer@aprosi21:~/Documents/Desarrollo> echo $?
  12. 0
  13. explorer@aprosi21:~/Documents/Desarrollo> ls -l /osifosd
  14. ls: no se puede acceder a /osifosd: No existe el fichero o el directorio
  15. explorer@aprosi21:~/Documents/Desarrollo> echo $?
  16. 2
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Otras salidas son las salidas estándar: la salida estándar y la salida estándar de error.

No está normalizado cómo ha de ser esas salidas, pero hay una pista: si la salida de tu programa es susceptible de ser entubada a otro programa, esa salida deberá ser lo más simple y clara posible, para que el programa que la reciba pueda interpretarla.

La salida que propones es muy clara: dos líneas de texto, con líneas que usan tabuladores.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Emular comandos Linux con Perl

Notapor gerkrt » 2011-02-16 06:53 @328

Vale. Pero el problema ahora es: ¿cómo puedo decirle desde Perl a Linux que guarde en la salida de estado, estándar o de error?
gerkrt
Perlero nuevo
Perlero nuevo
 
Mensajes: 33
Registrado: 2010-11-22 21:43 @946

Re: Emular comandos Linux con Perl

Notapor explorer » 2011-02-16 07:48 @366

Desde el programa Perl, si quieres enviar algo a la salida estándar, lo envías con un print() a secas, o hacia STDOUT:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print        "Ficheros copiados: $n\n";
print STDOUT "Ficheros copiados: $n\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si quieres enviar algo hacia la salida de error estándar, debes hacerlo hacia STDERR:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print STDERR "ERROR en la copia del fichero $f: $!\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y si quieres mandar al sistema el resultado de la operación, debes pasar ese valor como argumento a la función exit():
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($hubo_error) {
    exit 1;
}
else {
    exit 0;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


También puedes usar die() para los casos en los que algo vaya mal:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$hubo_error and die "ERROR: No pude copiar el fichero $f: $!\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


La variable $! almacena el texto del error devuelto por el sistema, así que se lo mostramos al usuario.

Más información en perldoc -f exit y perldoc -f die.

Es posible que este proyecto te inspire: Perl Power Tools
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Emular comandos Linux con Perl

Notapor gerkrt » 2011-02-16 09:34 @440

Vale, pues veo que tengo que cambiar algunas cosas.

Creo que voy a usar una función que añada errores (a un array) porque hasta ahora usaba el die() simple, pero claro, eso parte la ejecución por la mitad sin que pueda hacer nada.

Habrá el modo grave que acabará la ejecución del programa en ese instante haciendo el exit 1 y un print() al STDERR con todos los posibles errores. El modo no grave simplemente lo añadirá a la lista.

Y al final del script llamaré a una función para pasar el return() válido.

P.D.: ahora que me fijo, tengo otra duda: si mi script imprime otros mensajes usando print(), ¿cómo los diferencio del valor real de retorno del script?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
# Devuelve resumen final
print STDOUT "Entradas copiadas:\t$cont\nTotal archivos:\t$total_arxius";
# Sale pasando estado
exit 0;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Este es un ejemplo de que ha ido bien. Pero antes de eso mi script ha impreso un montón de líneas a la consola... ¿también las recibirá en un pipe o lo que fuera?
gerkrt
Perlero nuevo
Perlero nuevo
 
Mensajes: 33
Registrado: 2010-11-22 21:43 @946

Siguiente

Volver a Administración

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados