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)
someCommand 2> someFile.txt
and someCommand 2>> someFile.txt
also redirects stterr
to someFile.txt
– Slothworks
Aug 29 '15 at 13:32
make
command into a file it requires this syntax instead: make > someFile.txt 2>&1
(source: linuxquestions.org/questions/linux-newbie-8/…)
– Gabriel Staples
Jan 15 '18 at 0:49
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
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 3: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
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.
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 3 '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.
There 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.script
in the following context: Wake me up when a slow command line process wants my attention?
– sudodus
Dec 31 '19 at 0:09
script
for such an application :)
– WinEunuuchs2Unix
Dec 31 '19 at 0:16