Hi,
On Fri, Aug 26, 2011 at 11:08:15AM -0700, [email protected] wrote:
> Heres the wrapper if anybody is interested. It seems to work.
What I was getting at before, was something like this:
FvwmCommand -i2 'Test (EnvIsSet FOO) \
SendToModule FvwmCommandS $[FOO]' | awk '$2 ~ string {print $3}'
Which you could obviously wrap in a shell script, and get to accept input,
etc. It seems a little simpler than your perl example, although if there's
a need for this thing to persist in your case (you've still not actually
told me *what* use this is for, although at this point I suppose it doesn't
matter.)
Speaking of perl, I have some comments regarding your snippet. I don't know
if this is just a toy to you or not, but if you're thinking of using this
for anything long-term, which is supposed to provide a service and which you
don't want to have crash, you might want to cast your eye over this.
> Thanks in advance!
> Matt
>
>
> #####################################################################
> #! /usr/bin/perl -w
It's bad practise to do this in perl since there's now no selective way of
turning this off for other modules which include warnings. It's better just
to use an explicit:
use warnings;
> # fvwm-getenv, a handy dandy tool for extracting environment variables
> # from fvwm.
>
> use strict ;
>
> my $ev = shift @ARGV ;
> chomp $ev ;
> die ("usage: fvwm-getenv <environmentvariable> ") unless $ev =~ /\w+/ ;
Perhaps better written as:
die "...." unless @ARGV;
chomp(my $ev = shift);
> # MAKE A FIFO
> my $mkfifo = '/usr/bin/mkfifo -m 700' ; # the mkfifo command
Ouch! This should be using the module: File::Temp.
> my $tmppath = $ENV{'HOME'} . '/.fvwm/tmp' ; # you will need to create
> this directory
Again, can use File::Temp for this.
> my $rn = sprintf("%0.10d",rand(1000000000)) ; # a random number
> my $fifofn = $tmppath . '/' . $rn . '.fifo' ; # becomes a filename
> system("$mkfifo $fifofn") ; # and we create a temporary fifo
See: POSIX qw/mkfifo/;
Also -- running *anything* through system in scalar content is a bad idea.
> # FVWM PASSTHROUGH COMMAND
> my $fvwmcommand = 'FvwmCommand ' . "'" . "Test \(EnvIsSet $ev\) Exec
> echo \$[$ev] >> $fifofn" . "'" ;
This is the point at which I would have considered using FvwmPerl here (as
opposed to perllib outright.)
> my $childpid ; # know thyself
>
> if ($childpid = fork) { # Parent
> open (FIFOFN, $fifofn) ; #
The three-args form of open() is preferred these days.
> my $line = readline(FIFOFN) ; # catch the input
> print $line ; # print it
> close(FIFOFN) ;
> unlink $fifofn ; # delete the tmp file
> exit ;
> } else { # Child
> system($fvwmcommand) ; # create the output
Again, heed advise about scalar context, and perhaps look in to FvwmPerl.
HTH,
-- Thomas Adam
--
"Deep in my heart I wish I was wrong. But deep in my heart I know I am
not." -- Morrissey ("Girl Least Likely To" -- off of Viva Hate.)