• Publicidad

system y mutt

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

system y mutt

Notapor calan » 2012-01-30 08:02 @376

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
calan
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2012-01-30 07:51 @369

Publicidad

Re: system y mutt

Notapor explorer » 2012-01-30 09:58 @457

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 protected]', '<', $texto);
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: system y mutt

Notapor calan » 2012-01-30 14:36 @650

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
calan
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2012-01-30 07:51 @369

Re: system y mutt

Notapor explorer » 2012-01-30 16:02 @710

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):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $asunto = 'Asunto especial';
  2. my $email  = '[email protected]';
  3. my $texto  = 'Un texto que queremos enviar';
  4. system('/bin/bash', '-c', qq(mail -s "$asunto" $email <<< "$texto"));
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
(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 & 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: system y mutt

Notapor calan » 2012-01-30 17:31 @771

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.
calan
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2012-01-30 07:51 @369

Re: system y mutt

Notapor explorer » 2012-01-30 18:59 @832

calan escribiste: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 & 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: No hay usuarios registrados visitando el Foro y 30 invitados

cron