How do I save the output of a command to a file?
Is there a way without using any software? I would like to know how.
How do I save the output of a command to a file?
Is there a way without using any software? I would like to know how.
Yes it is possible, just redirect the output (AKA stdout) to a file:
SomeCommand > SomeFile.txt
Or if you want to append data:
SomeCommand >> SomeFile.txt
If you want stderr as well use this:
SomeCommand &> SomeFile.txt
or this to append:
SomeCommand &>> SomeFile.txt
if you want to have both stderr and output displayed on the console and in a file use this:
SomeCommand 2>&1 | tee SomeFile.txt
(If you want the output only, drop the 2 above)
To write the output of a command to a file, there are basically 10 commonly used ways.
Please note that the
n.e.in the syntax column means "not existing".
There is a way, but it's too complicated to fit into the column. You can find a helpful link in the List section about it.
|| visible in terminal || visible in file || existing
Syntax || StdOut | StdErr || StdOut | StdErr || file
==========++==========+==========++==========+==========++===========
> || no | yes || yes | no || overwrite
>> || no | yes || yes | no || append
|| | || | ||
2> || yes | no || no | yes || overwrite
2>> || yes | no || no | yes || append
|| | || | ||
&> || no | no || yes | yes || overwrite
&>> || no | no || yes | yes || append
|| | || | ||
| tee || yes | yes || yes | no || overwrite
| tee -a || yes | yes || yes | no || append
|| | || | ||
n.e. (*) || yes | yes || no | yes || overwrite
n.e. (*) || yes | yes || no | yes || append
|| | || | ||
|& tee || yes | yes || yes | yes || overwrite
|& tee -a || yes | yes || yes | yes || append
command > output.txt
The standard output stream will be redirected to the file only, it will not be visible in the terminal. If the file already exists, it gets overwritten.
command >> output.txt
The standard output stream will be redirected to the file only, it will not be visible in the terminal. If the file already exists, the new data will get appended to the end of the file.
command 2> output.txt
The standard error stream will be redirected to the file only, it will not be visible in the terminal. If the file already exists, it gets overwritten.
command 2>> output.txt
The standard error stream will be redirected to the file only, it will not be visible in the terminal. If the file already exists, the new data will get appended to the end of the file.
command &> output.txt
Both the standard output and standard error stream will be redirected to the file only, nothing will be visible in the terminal. If the file already exists, it gets overwritten.
command &>> output.txt
Both the standard output and standard error stream will be redirected to the file only, nothing will be visible in the terminal. If the file already exists, the new data will get appended to the end of the file..
command | tee output.txt
The standard output stream will be copied to the file, it will still be visible in the terminal. If the file already exists, it gets overwritten.
command | tee -a output.txt
The standard output stream will be copied to the file, it will still be visible in the terminal. If the file already exists, the new data will get appended to the end of the file.
(*)
Bash has no shorthand syntax that allows piping only StdErr to a second command, which would be needed here in combination with tee again to complete the table. If you really need something like that, please look at "How to pipe stderr, and not stdout?" on Stack Overflow for some ways how this can be done e.g. by swapping streams or using process substitution.
command |& tee output.txt
Both the standard output and standard error streams will be copied to the file while still being visible in the terminal. If the file already exists, it gets overwritten.
command |& tee -a output.txt
Both the standard output and standard error streams will be copied to the file while still being visible in the terminal. If the file already exists, the new data will get appended to the end of the file.
2>&1 redirects STDERR to STDOUT, 1>&2 redirects STDOUT to STDERR and 3>&1 would redirect stream 3 to STDERR.
– Byte Commander
Sep 19 '16 at 16:42
|& did not work for me on GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu). 2>&1 | tee produced the desired output of StdOut and StdErr to given file.
– samkhan13
Jan 27 '18 at 12:54
|& should be included in Bash since version 4.0 as synonym for 2>&1 |. I believe you either mistyped something in the command, have another Bash version than you claim, or tested it in a different shell, like sh instead of Bash. Are you really sure?
– Byte Commander
Jan 27 '18 at 19:03
sh: 1: Syntax error: "&" unexpected when I use |& tee from a Python script in a c9.io server. It seems a different shell is being used. echo $SHELL shows /bin/bash and $SHELL --version shows version 4.3.11(1)-release. I tried #!/bin/bash in my python script but I still get sh: 1: Syntax error. I got what I needed so I'm giving up on sorting the weirdness between sh and bash on my server. Thanks.
– samkhan13
Jan 28 '18 at 03:09
sh and not bash (or maybe bash in sh mode...). You can check what exactly your current shell process is using ps -p $$ -o cmd=, because echo $SHELL is unreliable and will show you your login shell, ignoring whether you might have started a different subshell.
– Byte Commander
Jan 28 '18 at 12:35
&>> does not work with bash(I'm on Mac), so I had to change it to >> log.txt 2>&1
– Caner
Apr 11 '18 at 12:29
{ YOUR_COMMAND | tee -a FILE.TXT ;} 2>&1 1>/dev/null | tee -a FILE.TXT - this first copies stdout and appends it to your file, then redirects stderr to stdout and disacrds the old stdout, then again copies and appends the new stdout (the redirected stderr) and appends it to your file too. This approach will probably mess up the line order of the two streams though... not sure. Try it out.
– Byte Commander
May 20 '18 at 14:08
make it surely works as well. Btw, you could also just have tried it...
– Byte Commander
Jul 24 '18 at 09:36
make do it like this: make > file.txt 2>&1 ".
– Danijel
Jul 24 '18 at 09:43
&> file is a shorthand for > file 2>&1 @Danijel . Your version is still correct as well though, and recommended if you need to support other or older shells.
– Byte Commander
Jul 24 '18 at 10:26
brew upgrade bash to get to the most recent version. (Trust me, it's worth the time)
– Connor McCormick
May 16 '19 at 21:21
&> works for me to redirect all outputs to different place instead of terminal.
– EsmaeelE
Aug 30 '19 at 22:19
2> >(tee -a stderr.log >&2). (Don't forget the space.) By the way, thanks for |& --didn't know about that one.
– Angelo
Aug 04 '21 at 07:03
command 2>&1 | tee ~/outputfile.txt rather than \&
– Exploring
Aug 06 '21 at 22:45
2> | tee file.txt to only have StdOut without StdErr on both terminal and file.
– André Casal
Mar 07 '23 at 10:00
You can also use tee to send the output to a file:
command | tee ~/outputfile.txt
A slight modification will catch stderr as well:
command 2>&1 | tee ~/outputfile.txt
or slightly shorter and less complicated:
command |& tee ~/outputfile.txt
tee is useful if you want to be able to capture command output while also viewing it live.
2>&1 . when I use it , I can't capture the java exceptions on the console . But with |& and tee , all is captured in the file
– kommradHomer
Nov 05 '20 at 09:24
|& tee does not work live for me. I only get the output to the terminal only after execution completes.
– S P Sharan
Nov 11 '22 at 01:21
script commandThere are two different questions here. The first is in the title:
How do I save terminal output to a file?
The second question is in the body:
How do I save the output of a command to a file?
All the answers posted here address the second question but none address the first question which has a great answer in Unix & Linux:
This answer uses a little known command called script which saves all your shell's output to a text file until you type exit. The command output still appears on your screen but also appears in the text file.
The process is simple. Use:
$ script ~/outputfile.txt
Script started, file is /home/rick/outputfile.txt
$ command1
$ command2
$ command3
$ exit
exit
Script done, file is /home/rick/outputfile.txt
Then look at your recorded output of commands 1, 2 & 3 with:
cat ~/outputfile.txt
This is similar to earlier answer of:
command |& tee ~/outputfile.txt
|& tee ~/outputfile.txt after each commnd.script command has added benefit (or disadvantage) of reloading ~/.bashrc when it starts.script command shows the command prompt ($PS1) followed by the command(s) you entered.script command records all the details in full color.Many times we want the output to go to the clipboard so we can paste it later. From this answer you can use:
cat ~/.bashrc | xclip -selection clipboard
Now you can use Ctrl+V in almost any application to paste the terminal output into your document. To paste the terminal output in the clipboard back into your terminal use Ctrl+Shift+V instead.
script in the following context: Wake me up when a slow command line process wants my attention?
– sudodus
Dec 31 '19 at 00:09
script for such an application :)
– WinEunuuchs2Unix
Dec 31 '19 at 00:16
Script started on 2021-08-20 11:14:49+10:00 [TERM="xterm" TTY="/dev/cons0" COLUMNS="80" LINES="24"] (script is empty) Script done on 2021-08-20 11:14:49+10:00 [COMMAND_EXIT_CODE="0"]
– Greg
Aug 20 '21 at 09:04
Cygwin which is used to run Linux on Windows. To run it in Ubuntu you would have to use wine. So you would be using Linux to Cygwin to Windows to Wine to Linux for your problem to be supported here on Ask Ubuntu. Otherwise it would be a problem best posted on Super User.
– WinEunuuchs2Unix
Dec 13 '21 at 01:10
You can redirect the command output to a file:
your_command >/path/to/file
To append the command output to a file instead of overwriting it, use:
your_command >>/path/to/file
An enhancement to consider -
Various scripts will inject color codes into the output which you may not want cluttering up your log file.
To fix this, you can use the program sed to strip out those codes. Example:
command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt
ls and grep, support --color=auto, which outputs color codes only if standard output is a terminal.
– Eliah Kagan
Sep 03 '17 at 14:37
some_command | tee command.log and some_command > command.log have the issue that they do not save the command output to the command.log file in real-time.
To avoid that issue and save the command output in real-time, you may append unbuffer, which comes with the expect package.
Example:
sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log
Assuming log.py contains:
import time
print('testing')
time.sleep(100) # sleeping for 100 seconds
you can run unbuffer python log.py | tee command.log or unbuffer python log.py > command.log
More information: How can I save a command output to a file in real-time?
For cron jobs etc you want to avoid the Bash extensions. The equivalent POSIX sh redirection operators are
Bash POSIX
------------ --------------
foo &> bar foo >bar 2>&1
foo &>> bar foo >>bar 2>&1
foo |& bar foo 2>&1 | bar
You'll notice that the POSIX facility is in some sense simpler and more straightforward. The &> syntax was borrowed from csh which should already convince you that it's a bad idea.
If you want to output to the file while the command is being run:
script -c ./path/to/executable.bash -f log.txt
An option not mentioned yet, that can save colours / colors too, is to use a console program — such as Konsole (KDE/Plasma's default terminal emulator) — to save the output.
Konsole has:
File > Save output as...
the shortcut is Ctrl+Shift+S; it allows the output to be saved as a text file, or as HTML including colors! I'm not sure exactly how much it will save but in my test it only included ~1000, the entire terminal scrollback, (you can increase the buffer by creating a new profile, Profile > New..., and then change the Scrolling settings to capture more; Konsole version 4:21.08.1).
gnome-terminal has "copy output as HTML" too, which allows pasting the HTML into a document; it preserves colour but only copies the content of the output currently shown on screen AFAICT.
You can, of course, do a straight drag-select (hold left mouse button whilst dragging) and then copy (ctrl+c, Edit > Copy, or right-mouse-click and choose copy).
Feel free to modify this answer to include other popular terminal apps. My favourite, Yakuake, does not appear to have this feature nor did most of the popular terminals I reviewed, including terminal.app and Hyper.
Add this to your .bashrc (based on the script command):
### Logging function:
start_terminal_logging()
{
if [ -z "$SCRIPT_LOG_FILE_ACTIVE" ]; then
# Log each session to a separate file:
logdir=~/.terminal_logs
logfile=$logdir/session_log_$(date +%Y%m%d_%H%M%S)_$$.txt
# If no folder exist make one:
if [ ! -d $logdir ]; then
mkdir -p $logdir
fi
export SCRIPT_LOG_FILE_ACTIVE=$logfile
# Start logging, a=append, q=quiet:
script -aq $logfile
exit
fi
}
### Start logging:
start_terminal_logging
This will give you a separate file for each session:
session_log_20240107_152455_1955.txt
session_log_20240124_112455_2971.txt
session_log_20240125_092455_6925.txt
session_log_20240125_092750_7048.txt
session_log_20240125_092808_7079.txt
.
.
.
Filename contains a timestamp, so you can easier find what you are looking for.
someCommand 2> someFile.txtandsomeCommand 2>> someFile.txtalso redirectsstterrto someFile.txt – Slothworks Aug 29 '15 at 13:32makecommand into a file it requires this syntax instead:make > someFile.txt 2>&1(source: https://www.linuxquestions.org/questions/linux-newbie-8/redirecting-make-output-to-file-594997/#post2938625) – Gabriel Staples Jan 15 '18 at 00:49