21

My aim is to log all output from a script into a directory that the script is going to create.

For example, I have:

~/.abc.sh:

#! /bin/bash
rails new myapp

When I run...

cd ~/code
. ~/.abc.sh

...that will create a new Rails app in directory ~/code/myapp.

When Rails is creating an app, it outputs a whole lot of text that I want to capture and store in a log file in the same directory the rails command newly created. I also want to display that text in the terminal as well.

How do I go about doing this?

2 Answers 2

43

You can use the tee command for that:

command | tee /path/to/logfile

The equivelent without writing to the shell would be:

command > /path/to/logfile

If you want to append (>>) and show the output in the shell, use the -a option:

command | tee -a /path/to/logfile

Please note that the pipe will catch stdout only, errors to stderr are not processed by the pipe with tee. If you want to log errors (from stderr), use:

command 2>&1 | tee /path/to/logfile

This means: run command and redirect the stderr stream (2) to stdout (1). That will be passed to the pipe with the tee application.

7
  • Do you mean ~/.abc.sh | tee <file> ? If so, then the trouble is I don't know in which directory the script is going to create the app when I call it, so how would I know what to give the in the file argument? (Thanks for the great examples)
    – Zabba
    Apr 29, 2011 at 18:19
  • @Zabba: what about creating a temporary file and move it afterwards?
    – Lekensteyn
    Apr 29, 2011 at 18:20
  • Ok, that should work :). In regard to that, how do I create a temp file with a random name that I can then output to and then copy to a desired location afterwards? Is there some built-in command to get a "temp file name" ?
    – Zabba
    Apr 29, 2011 at 18:21
  • @Zabba: the command for that is mktemp. See the manual page man mktemp.
    – Lekensteyn
    Apr 29, 2011 at 19:15
  • 跪拜, work like a charm
    – Sun Junwen
    Jun 8, 2015 at 8:07
2

script will start an interactive session and log all the output (stdout/stderr etc) to a file, or (with the -c parameter) will run a command and log the output of that.

script -c ~/.abc.sh -f abc.log

Note: in an interactive session, you can stop recording just by exiting the session as you normally would (e.g. exit or Ctrl-D).

For session recording with video playback, you can also try asciinema.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .