Interactive programs & Teeing

C

conrado.blasco

I'm trying to write an interactive script that gets commands from
STDIN, prints the results to STDOUT, *and* tees the results to a log
file.

My problem is that when I add the teeing line to the program (see
below), the script doesn't print anything to STDOUT anymore (not even
the prompt). When I comment out that line, everything works fine
(except that I don't get the log file).

(Well, it actually still prints something, but only when the session is
over.)

It seems to me that I'm missing something very obvious, but I can't
figure out... Any help appreciated.

Relevant excerpt below:

#!/usr/bin/env perl
use warnings; # Needed since '-w' won't work on the shebang line
use strict;
use File::Basename;

my $my_name = fileparse($0);

# STDOUT prints on the screen as well as on to log file
open (STDOUT, "| tee ./" . $my_name . ".log")
or die "Teeing error: $!\n";

my $prompt = "$my_name > ";

# Main loop, read and parse standard input
print $prompt;
while (<STDIN>) {
parse_cmdline($_);
print $prompt;
}
 
B

boyd

I'm trying to write an interactive script that gets commands from
STDIN, prints the results to STDOUT, *and* tees the results to a log
file.

My problem is that when I add the teeing line to the program (see
below), the script doesn't print anything to STDOUT anymore (not even
the prompt). When I comment out that line, everything works fine
(except that I don't get the log file).

(Well, it actually still prints something, but only when the session is
over.)

It seems to me that I'm missing something very obvious, but I can't
figure out... Any help appreciated.

Relevant excerpt below:

#!/usr/bin/env perl
use warnings; # Needed since '-w' won't work on the shebang line
use strict;
use File::Basename;

my $my_name = fileparse($0);

# STDOUT prints on the screen as well as on to log file
open (STDOUT, "| tee ./" . $my_name . ".log")
or die "Teeing error: $!\n";

my $prompt = "$my_name > ";

# Main loop, read and parse standard input
print $prompt;
while (<STDIN>) {
parse_cmdline($_);
print $prompt;
}

It sounds like a buffering problem. Try adding $|++; near the top.

Boyd
 
M

Mumia W. (reading news)

I'm trying to write an interactive script that gets commands from
STDIN, prints the results to STDOUT, *and* tees the results to a log
file. [...]

(Well, it actually still prints something, but only when the session is
over.)
[...]

It's best just to open the log file and print twice: once to STDOUT and
once to the log file.

The combination of Perl's buffering and tee's buffering result in your
inability to get immediate output if STDOUT is sending to tee.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top