How to print Linux command output to a file?

by vijay.shad   Last Updated June 13, 2019 09:01 AM

I am creating a script to sync my important documents between two system. I want my script to generate a log file for the last action. can you suggest me a way to achieve this.

Question: If I execute the rsync command with -v flag, it will print a lot of messages on the console. Is there any way. So, I can redirect these logs to a file?

Answers 4

Use the > operator:

rsync -v > log.txt

will write the output of the rsync command to a file named log.txt.

April 29, 2010 17:41 PM

You can call your script and redirect "standard output" (AKA STDOUT) to a log file. Use '>>' to append to the log file or '>' to overwrite the log file. The file will be created (if permissions on it's directory allow) if it doesn't already exist. If the file already exists, make sure it is writeable by you (or whoever runs your script).

If you always append to the log file rather than write over it, it is good practice to make sure from the very beginning that something will "rotate" your log file, that is, move it to some other name and remove older log files. If the log file is unique to your script, you could have your script take care of log file rotation.

Usually, the preferred way is to call your script with STDOUT redirected, but there may be times when you want to do the redirecting within the script itself for one or more commands. You can add ">> logfile" after any statement in a shell script to append STDOUT of that command to logfile. You can change that to "2>&1 >> logfile" to append both "standard error" (AKA STDERR) and STDOUT to logfile. You don't usually want to have STDERR also go to the logfile as STDERR is usually used to notify whatever/whoever is running the script of a problem. But there are times and situations where you do want that. If you like, you can group commands in your script inside { and } and redirect STDOUT of the whole group at once by putting the redirection after that closing brace.

Marnix A.  van Ammers
Marnix A. van Ammers
April 29, 2010 18:03 PM

If you want to record every command you type, you can use the script command.

April 29, 2010 18:54 PM

In addition to the above, if you are curious to see the output printed to the screen AND to a file for archiving/grepping/etc, you might want to "tee" the output. It's a great command and is named after the T pipe found in real-world plumbing, and works well for "sub-consoles" like mysql, etc.

The command is tee... here's an example copied from a user named "toydi":

To display and log the output from a command at the same time: ls -l | tee -a file.log In this example, it will display the directory listing output and as well, save the output into file.log. The option -a signals the command to append rather than overwrite the file.

Also, check the picture on wikipedia for a nice visualization on how tee works. I'd link to it, but I don't have enough "reputation points" to post more than 1 link, and I felt "toydi" deserved the link credit :)

April 29, 2010 20:01 PM

Related Questions

Updated September 28, 2017 00:01 AM

Updated February 07, 2019 14:01 PM

Updated December 20, 2018 16:01 PM

Updated May 08, 2019 08:01 AM

Updated June 25, 2019 21:01 PM