To write the output of a command to a file, there are basically 10 commonly used ways.
Overview:
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
List:
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.
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.
But you don't have to use |& tee ~/outputfile.txt after each commnd.
The script command has added benefit (or disadvantage) of reloading ~/.bashrc when it starts.
The script command shows the command prompt ($PS1) followed by the command(s) you entered.
The script command records all the details in full color.
Send output to clipboard
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.
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.
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.
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
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
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.
generically
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).
others?
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.
Yes it is possible, just redirect the output (AKA
stdout
) to a file:Or if you want to append data:
If you want
stderr
as well use this:or this to append:
if you want to have both
stderr
and output displayed on the console and in a file use this:(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.
Overview:
List:
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.
You can also use
tee
to send the output to a file:A slight modification will catch stderr as well:
or slightly shorter and less complicated:
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:
To append the command output to a file instead of overwriting it, use:
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:
The
script
commandThere are two different questions here. The first is in the title:
The second question is in the body:
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 typeexit
. The command output still appears on your screen but also appears in the text file.The process is simple. Use:
Then look at your recorded output of commands 1, 2 & 3 with:
This is similar to earlier answer of:
|& tee ~/outputfile.txt
after eachcommnd
.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.Send output to clipboard
Many times we want the output to go to the clipboard so we can paste it later. From this answer you can use:
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.
some_command | tee command.log
andsome_command > command.log
have the issue that they do not save the command output to thecommand.log
file in real-time.To avoid that issue and save the command output in real-time, you may append
unbuffer
, which comes with theexpect
package.Example:
Assuming
log.py
contains:you can run
unbuffer python log.py | tee command.log
orunbuffer 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 POSIXsh
redirection operators areYou'll notice that the POSIX facility is in some sense simpler and more straightforward. The
&>
syntax was borrowed fromcsh
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:
Use terminal emulator features
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
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
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.generically
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).
others?
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.