Mailing List Archive


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [tlug] Sticky problem with pipes, head and tails



Oh well...

May be a good candidate for http://thedailywtf.com/ (for the original code)?

On Wed, Sep 1, 2010 at 08:21, Stuart Luppescu <slu@example.com> wrote:
> Hello, As you can see from my signature in this message (yes, I know
> it's longer than 4 lines), I use the R fortune function to generate a
> fortune, which is then fed to the signature program, which constructs a
> named pipe containing the fortune-bearing sig, which is then included in
> mail messages. The problem is that it's got extraneous junk in it and I
> can't figure out how to get rid of it. This is the command that
> generates the fortune:
>
> /usr/bin/R --no-save --no-restore -q < /home/sl70/print-fortune.R
>
> This produces this:
>> library(fortunes)
>> fortune()
>
> Michael Watson: Hopefully this one isn't in the manual or I am about to get shot :-S
> Peter Dalgaard: *Kapow*...
>   -- Michael Watson and Peter Dalgaard (question on axis())
>      R-help (February 2006)
>
>>
>
> I would like to remove the first two lines and the last line, so I
> changed the command to this:
> /usr/bin/R --no-save --no-restore < /home/sl70/print-fortune.R  |tail \
> -n  +23  | head -n -2 2> /dev/null
>
> That give the desired result when I run it at the command line, but when
> I feed it to the signature program, I get this message:
>
> Program /usr/local/bin/r-fortune doesn't seem to exist
>
> This is the program code that produces this error:
>
>         /* check for existence of program by forking and then trying to
>               exec() it in the child */
>            pid = fork();
>            switch (pid) {
>            case -1:            /* oh well */
>                perror("Couldn't fork() a child process");
>                exit(EXIT_FAILURE);
>            case 0:             /* in child */
>                /* close stdout */
>                close(1);
>                execlp(producer, producer, (char *) 0);
>                exit(EXIT_FAILURE);
>            default:
>                waitpid(pid, &exit_status, 0);
>                if (exit_status != EXIT_SUCCESS) {
>                    fprintf(stderr, "Program %s doesn't seem to exist\n",
>                            producer);
>                    exit(EXIT_FAILURE);
>                }

You are hitting the hard coded default case (Duh!) which is naively
coded to say "Program %s doesn't seem to exist\n" instead of showing
you exit_status...

Why you get /usr/local/bin/r-fortune in execlp(producer, producer,
(char *) 0) is beyond me and why use producer twice?

But why don't you put your "code" in a bash script like this:

#!/bin/sh
/usr/bin/R --no-save --no-restore < /home/sl70/print-fortune.R  |tail
-n  +23  | head -n -2 2> /dev/null

then execute that as a work around?

Cheers,
Kalin.


Home | Main Index | Thread Index

Home Page Mailing List Linux and Japan TLUG Members Links