• Publicidad

Problema con comandos unix en script [Primeros pasos]

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problema con comandos unix en script [Primeros pasos]

Notapor ramiromd » 2010-10-23 16:28 @727

Buenas, es mi primer post en el foro, como así también mis primeros pasos en Perl. Si bien tengo conocimientos básicos sobre C y Bash, me decanté por Perl para hacer algunos scripts para Conky por el hecho de conocer algo nuevo y porque he visto varios scripts bastante completitos realizados con este lenguaje.

Ahora si voy de lleno a mi consulta. La cuestión es que estoy realizando un script que me informe el modo en el que está trabajando mi placa de red (managed, monitor, etc..).

El código inicialmente es el siguiente, me falta retocarlo, está muy rústico aún. Pero me quedé trabado un poco, dejo el código comentado con mis ideas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. #inicializo una variable tipo string que guarde la salida del comando iwconfig.
  6. my $m = system(`sudo /sbin/iwconfig eth1 | grep -i 'Managed'`);
  7. #la imprimo a modo de "testeo"
  8. printf ("La salida fue: %s \n", $m);
  9. #analizo el modo de la placa en base a la salida (si la salida esta vacia es porque no encontro la palabra "Managed"
  10. if ($m == 0){
  11.   print "Monitor"
  12. }else{
  13.   print "Managed"
  14. }
  15.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Cuando lo ejecuto en la consola me tira los siguientes errores:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Can't exec "Mode:Managed": No existe el fichero o el directorio at ethmode.pl line 5.
La salida fue: -1
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


El script tiene permisos de ejecución, pero no entiendo bien el primer error. El segundo (la mala impresión) puede ser consecuencia del primero.

Bueno agradecería cualquier tipo de ayuda.
Un saludo y gracias.

PD: ¿Hay algún libro del estilo del Kernigham de C pero sobre Perl? ¿Y existe alguna edición en Español?
ramiromd
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2010-10-23 15:53 @703

Publicidad

Re: Problema con comandos unix en script [Primeros pasos]

Notapor explorer » 2010-10-23 17:06 @754

Bienvenido a los foros de Perl en Español, ramiromd.

El problema de la línea 6 son las comillas invertidas.

Verás, las comillas invertidas, en Perl, tienen la misión de crear un entorno shell y ejecutar en él el comando que esté entre ellas.

Ahora, repasa la línea 6:
* estás mandando ejecutar en el sistema (por medio de las comillas invertidas) el comando sudo /sbin/iwconfig eth1 | grep -i 'Managed'

* Al resultado de la ejecución (lo que se haya recibido por la salida estándar del comando), lo vas a ejecutar con la función system(), que va a hacer lo mismo que las comillas invertidas (crear un shell, etc. etc.)

Es decir... que estás ejecutando dos veces. Una el comando, y otra, el resultado del comando. Es por eso que sale un error: el shell arrancado por el system() no reconoce como un comando válido lo que el primer comando ha devuelto.

Haz esto: cambia las comillas invertidas por comillas dobles (también valdría comillas simples, pero como ya hay comillas simples en el comando, es mejor no mezclarlas -ni liarnos-).

Pero... el resultado de system() no es lo que hayamos recibido por la salida estándar del comando ejecutado, sino el estado (status) del resultado de la ejecución (un número entero de 8 bits, normalmente.

Viendo el resto del programa, se ve que no es eso lo que quieres, sino el resultado de la ejecución del comando. Necesitamos cambiar system() por otra cosa. Por las comillas simples invertidas, por ejemplo (o por qx(), que hace lo mismo).

Quedaría así:
my $m = `sudo /sbin/iwconfig eth1 | grep -i 'Managed'`;

Aprender C y Bash es una gran ventaja para ti, porque Perl hereda muchas de sus propiedades (muchas, muchas). Pero te animo a que profundices un poco más en su rica sintaxis. Por ejemplo, la línea siguiente

printf ("La salida fue: %s \n", $m);

en Perl se escribe así:

print "La salida fue: $m \n";

y en los últimos dos años (con Perl v5.10):

say "La salida fue: $m";

Otro detalle, que está en tus comentarios... las variables '$' no son de un tipo "string", sino que son escalares, es decir, almacenan un solo valor, que, en este caso, es una cadena de texto. Pero puede que a la línea siguiente sean un número en punto flotante. La cuestión es que sea un solo valor.

En cuanto a libros, del estilo de Kernighan, quizás sea el Programming Perl, de Larry Wall, pero su contenido es, básicamente, lo mismo que si haces man perlsyn.

En español, hay pocos libros de Perl. Casi toda la documentación está en inglés, aunque unos pocos estamos trabajando para que eso cambie.

Puede servirte, para empezar, este mensaje sobre Por dónde empezar, que tiene enlaces a lugares interesantes para el que comienza y quiere ser programador de Perl.
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: Problema con comandos unix en script [Primeros pasos]

Notapor ramiromd » 2010-10-23 17:37 @776

Explorer, gracias por la buena onda. Arreglé lo que me comentaste con respecto a la función system().
Luego había una burrada de mi parte intentando comparar un string con un entero, ¡ja,ja!

Ya lo solucioné ¡y está andando de 10!

Con respecto a lo del printf(), vi en algún blog que lo usaban en los códigos y me tiré un tute a ver qué pasaba, era solo para probar.

Un saludo y muchas gracias.


PD: Algo me dice que me van a ver seguido por acá (para su desgracia ¡ja,ja!)
ramiromd
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2010-10-23 15:53 @703

Re: Problema con comandos unix en script [Primeros pasos]

Notapor explorer » 2010-10-23 20:27 @894

ramiromd escribiste:Luego había una burrada de mi parte intentando comparar un string con un entero, ¡ja,ja!
Pues... el caso es que NO es una burrada... En Perl es completamente legal. Por eso no te he dicho nada antes de que estuviera mal. Perl ya se encarga de hacer las transformaciones necesarias para pasar de cadena de texto a número y viceversa.

ramiromd escribiste:Con respecto a lo del printf(), vi en algún blog que lo usaban en los códigos y me tiré un tute a ver qué pasaba, era solo para probar.
Sí, printf() sí que existe en Perl. Yo solo te he mostrado otras formas para usar print() y printf() (y say()).

Toda la información sobre Perl ya está instalada en tu propio ordenador.

Si estás en Windows, en formato HTML. Si estás en Linux, en formato POD. Para consultarla desde la línea de comandos puedes usar el comando perldoc.

Por ejemplo, para consultar la lista de operadores, escribirías perldoc perlop. O la lista de funciones con perldoc perlfunc.

También puedes consultarlo en Internet, en http://perldoc.perl.org/perlfunc.html.

Si usas Firefox, puedes instalar un motor de búsqueda dirigido a ese sitio.

Finalmente, para saber qué hace una sola función, puedes solicitarlo también a perldoc: perldoc -f printf.
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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 31 invitados