• Publicidad

Error al ejecutar system("echo")

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

Error al ejecutar system("echo")

Notapor SunlightRider » 2010-09-07 23:51 @035

Hola, de nuevo =P.

Les cuento que soy un feliz usuario de una Mac, la cual tiene luces bajo las teclas que se manejan con sus correspondientes teclas en el teclado. Las luces funcionan perfectamente: al modificar un archivo con un número se encienden y se cambia la intensidad. Vi por ahí que había un script para bindearlo a las teclas y así poder cambiarlas con las del teclado, pero sin embargo, ya que estoy aprendiendo Perl, decidí hacer el mio propio, y me estoy volviendo loco.

Lo siguiente funciona perfectamente.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. my $mas = 2;
  3. system("echo $mas > /sys/class/leds/smc::kbd_backlight/brightness");
  4.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Este es mi script, el cual no funciona correctamente (corriéndolo como root, por supuesto)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. #use warnings;
  3.  
  4. my $salto = 25.5;
  5.  
  6. open(ARCHIVO, "/sys/class/leds/smc::kbd_backlight/brightness") || die("No se encontro el Archivo de Brightness\n");
  7. @intensidad = <ARCHIVO>;
  8. close(ARCHIVO);
  9. chomp(@intensidad[0]);
  10.  
  11.  
  12. my $var = @intensidad[0];
  13. my $mas = $var + $salto;
  14. my $menos = $var - $salto;
  15.  
  16. if($ARGV[0] eq up){
  17.         system("echo $mas > /sys/class/leds/smc::kbd_backlight/brightness");
  18. }elsif($ARGV[0] eq down){
  19.         system("echo $menos > /sys/class/leds/smc::kbd_backlight/brightness");
  20. }else{
  21.         print "No se encontro el archivo\n";
  22. }
  23.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Corriendo mi script me encuentro con este error:

root[@]/home/jsanchez/Scripts#./kb-backlight.pl up
sh: line 0: echo: write error: Invalid argument


He buscado el error en Google y la mayoría de las cosas que saltan son bugs, que no pretendo entender de qué se habla. Pero la razón del post, es que...

¿Por qué el primero funciona, y el segundo no?

Edito: sí, también probé con comillas en: eq "up" || "down"

Saludos.
SunlightRider
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2010-08-26 00:46 @074

Publicidad

Re: Error al ejecutar system(echo) - Me tiene loco.

Notapor salva » 2010-09-08 06:03 @293

¿No será que $menos toma un valor negativo?

Prueba poniendo un guion doble después de echo en la llamada a system:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
system("echo -- $menos > /sys/class/leds/smc::kbd_backlight/brightness");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Re: Error al ejecutar system("echo")

Notapor SunlightRider » 2010-09-08 10:36 @483

Ya lo encontré, el problema era que el archivo en el que intentaba escribir, no aceptaba números con coma.

Saludos y Gracias.
SunlightRider
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2010-08-26 00:46 @074

Re: Error al ejecutar system("echo")

Notapor explorer » 2010-09-08 11:42 @529

Hay una serie de errores, que no lo son tanto porque Perl los permite, pero que hay que entenderlos porque puede darnos problemas más tarde.

@intensidad[0]

Este es uno de los problemas que tienen las personas que empiezan con Perl: sabemos que @intensidad es un array, pero cuando queremos obtener un solo elemento de ese array, queremos obtener un solo elemento, un escalar. Por eso, lo correcto es escribir

$intensidad[0]

Lo primero, con la '@', quiere decir: "quiero obtener una lista de elementos, compuesta del elemento primero de @intensidad". Aunque lo parezca, no es lo mismo que "quiero obtener el primer elemento de @intensidad". En algunas situaciones, en las que el contexto sea importante, esta pequeña diferencia puede provocar problemas.

$ARGV[0] eq up

Aquí, el error es que "up" no está entrecomillado. Perl, intentará ejecutar la función up(), y si no la encuentra, lo tratará como una palabra constante, que era justo lo que queríamos al principio. Así que es mejor escribirlo como

$ARGV[0] eq 'up'

Lo mismo para 'down', claro.
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 44 invitados