Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Básico » system y mutt Responder al tema
Nuevo tema


Página 1 de 1  [ 6 mensajes ] 
 
Nota 2012-01-30 08:02 @376

Perlero Nuevo
Registrado: 2012-01-30 07:51 @369
Mensajes: 3
system y mutt
Hola, estoy intentando hacer un script en Perl para mandar un email en caso de que el disco alcance un porcentaje de uso determinado.

Uso el comando de sistema "mutt" al que invoco con la orden "system" pero tengo un problema al usarlo dentro del script.

system("mutt -s 'asunto' email\@dominio.com <<< 'texto'")

uso \@ para introducir la arroba, al ser una carácter reservado.
lo he intentado también con variables en lugar de introducir el texto entre comillas simples, pero siempre da el mismo error.

sh: Syntax error: redirection unexpected


Nota 2012-01-30 09:58 @457
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: system y mutt
Bienvenido a los foros de Perl en español, calan.

El problema no es de Perl, sino del shell, que se encuentra con '<<<', y te avisa de que no es redireccionamiento reconocido.

Prueba con esto:

my $texto = 'texto';

system("mutt -s 'asunto' email\@dominio.com < '$texto'");

O también (no probado)

system('mutt', '-s', 'asunto', 'email@dominio.com', '<', $texto);

_________________
JF^D Perl programming


Nota 2012-01-30 14:36 @650

Perlero Nuevo
Registrado: 2012-01-30 07:51 @369
Mensajes: 3
Re: system y mutt
Gracias, explorer.

El caso es que pruebo la orden mutt en un script de bash y funciona con esa notación de "<<<".

En el script Perl no funciona ni siquiera aunque le deje un solo signo "<" como me aconsejas.

Ahora el error es:

sh: cannot open "valor de la variable": No such file

La segunda opción da un resultado todavía más sorprendente... porque si lo ejecuto con la segunda opción que no estaba probada sucede un expediente X:

El caso es que cuando ejecuto el script sucede lo siguiente: en el terminal aparece la siguiente línea:

To: "valor de la variable $texto"@"el nombre de mi pc"

Tras esto escribo algo y aparece ahora lo siguiente:

Subject: asunto

Nuevamente escribo algo y ahora aparece dos líneas de error idénticas y además:

Error leyendo /home/carlos/.nano_history: Permiso denegado
Error leyendo /home/carlos/.nano_history: Permiso denegado


Pulsa intro para continuar iniciando nano.

A continuación de esto, se abre el editor nano y al cerrarlo se acaba todo.

¿¿¿¿¿?????

¿Mi ordenador hace lo que quiere o soy yo que no controlo el poder que tengo en los dedos?

Un saludo, explorer


Nota 2012-01-30 16:02 @710
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: system y mutt
Por partes...

La notación '<<<' NO es una redirección... Es decir, el shell NO va a leer un fichero externo y lo va a redirigir hacia el comando mutt.

Viendo el manual de bash, vemos que '<<<' sirve para definir 'Here Strings'. Bash expande el texto (si tuviera caracteres comodines) y lo mete en la entrada estándar del comando. Así que sí: sí tienes razón en usarlo (de hecho, no lo conocía, y me lo apunto para mis trabajos futuros).

Entonces, sí que te funciona en tus scripts bash.... y ahí está el problema...

system() NO ejecuta bash, sino sh. Y si miras la página de manual de sh, no tiene ningún redireccionamiento '<<<'. Y por eso, sale error.

Cierto que en muchos sistemas, sh es un enlace al programa bash, pero no siempre es así.

Solución... 1) Modificar la línea de comandos para que siga la notación de sh. Podría ser con (no probado)

echo "texto" | mutt -s "asunto" correo@electronico

2) Decirle a system() que sí ejecute nuestro comando bajo bash y la opción -c (ejemplo que he probado):
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. my $asunto = 'Asunto especial';
  2. my $email  = 'email@elsuperdominio.com';
  3. my $texto  = 'Un texto que queremos enviar';
  4. system('/bin/bash', '-c', qq(mail -s "$asunto" $email <<< "$texto"));
(Bueno, yo, en vez de mutt, lo he hecho con el comando mail, que para enviar un correo sencillo, vale) (Por el hecho de usar varios argumentos en system(), Perl ejecuta el primer argumento como el programa principal, y le pasa el resto de argumentos. Más información en peldoc -f system).

Fíjate que he usado el operador qq(), que tiene la misma función que las comillas dobles, así que se hará la interpolación de las variables Perl dentro de la cadena, mientras podemos seguir usando las comillas dobles como caracteres literales, ya que necesitamos entrecomillar tanto el $texto como el $asunto, ya que podrían contener espacios en blanco -como así es en el ejemplo-, que son significativos para bash. Poniendo las comillas dobles, bash los trata como un solo argumento.

Un hilo parecido.

_________________
JF^D Perl programming


Nota 2012-01-30 17:31 @771

Perlero Nuevo
Registrado: 2012-01-30 07:51 @369
Mensajes: 3
Re: system y mutt
Hola de nuevo explorer.

Por fin ha funcionado usando la segunda solución.

Sólo una pequeña pega al definir la variable con la dirección del correo electrónico, ya que hay que añadir el signo "\" antes del signo "@" para que el intérprete haga bien su trabajo de interpretar e interprete bien.

El Perl me encanta, pero tiene muchos intríngulis sintácticos que hay que conocer.

Muchas gracias.


Nota 2012-01-30 18:59 @832
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: system y mutt
calan escribió:
Sólo una pequeña pega al definir la variable con la dirección del correo electrónico, ya que hay que añadir el signo "\" antes del signo "@" para que el intérprete haga bien su trabajo de interpretar e interprete bien.
Por esa razón he definido el correo electrónico en una variable, en una línea aparte: al poner la dirección con comillas simples, no es necesario poner la '\' (el ejemplo que te he dado funciona tal cual lo ves ahí).

En Perl, no son lo mismo las comillas simples que las dobles. Las primeras indican cadenas de caracteres literales, mientras que las segundas hacen una expansión de las variables que haya en la cadena.

Y, sí: Perl tiene una sintaxis muy amplia, lo que nos permite hacer programas de muchas formas distintas ;)

_________________
JF^D Perl programming


Responder al tema  [ 6 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO