Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Possible Duplicate:
Show only stderr on screen but write both stdout and stderr to file
stdout , stderr and logging using the script command

cat test.sh:

rm -v foo.tmp

cat test2.sh:

script bar.log -c './test.sh'

When executing test2.sh I would like to see the following for example on my terminal:

Fri Feb 17 18:04:30 PST 2012  

However in bar.log I would like to see:

removed 'foo.tmp'  
Fri Feb 17 18:04:30 PST 2012  

or (in case foo.tmp does not exist)

rm: cannot remove 'foo.tmp'  
Fri Feb 17 18:04:30 PST 2012  

Is this doable?

share|improve this question

marked as duplicate by Mat, Caleb, Gilles, Michael Mrozek Feb 23 '12 at 7:05

This question was marked as an exact duplicate of an existing question.

This is difficult to do directly because script collects all the output on a temporary terminal and displays that appears on that terminal on its own standard output.

In test.sh, you need to have some way to distinguish the messages you want on the terminal from the messages you only want in the transcript. For example, add a prefix to each line indicating its importance level. As the other lines in your example don't start with @, I'll just prefix non-essential (transcript-only) lines with @.

rm -v foo.tmp | sed 's/^/@/'

And in the wrapper script:

script bar.log -c './test.sh | grep -v "^@"'

I don't think you can do much better without modifying the script utility. (If you want to go that route, I think the simplest method would involve a few lines of expect.)

share|improve this answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.