10

How to record the output of a bash script from terminal without suppressing the terminal output like $ ./bash-script.sh >> terminal.txt ? and I want to record the resulting output to text and keep it in the terminal as well.

9
  • It simply writes any output into a file. The language is irrelevant, not sure what you mean? Sep 7, 2016 at 7:15
  • 4
    In what way? it is an exact dupe, what requirements? Sep 7, 2016 at 7:59
  • The alleged duplicate asks How do I save the output of a command to a file? This question asks I want to record the resulting output to text and keep it in the terminal as well. While the linked post provides partial answer, this is not exact duplicate, hence reopening this question Sep 8, 2016 at 5:52
  • @Serg Common Serg, Why? Let's not do this. You know there are many other candidates, it is a dupe anyway and the dupe fully addressed his issue. Nothing wrong with posting a dupe. Sep 8, 2016 at 6:57
  • @user72216 I am sure it's a dupe, but not of the one that was linked. I did find a different one. Will close it shortly Sep 8, 2016 at 7:22

3 Answers 3

10

 I want to record the resulting output to text and keep it in the terminal as well

What you want is tee command. It allows echoing text to stdout and to a file. For example:

$ ls -l /etc/passwd | tee output_file.txt                                      
-rw-r--r-- 1 root root 2989 6月  17 20:45 /etc/passwd
$ cat output_file.txt                                                          
-rw-r--r-- 1 root root 2989 6月  17 20:45 /etc/passwd
9
  • 2
    The requirement of the question were changing and it seems I was late to adjust the answer according to the last change. congrats! :)
    – Anwar
    Sep 7, 2016 at 5:28
  • @Anwar indeed , I reviewed the edit history just now. OP clearly kept changing it. Perhaps they didn't phrase it properly right away. Sep 7, 2016 at 5:31
  • Sorry Anwar, i knew the previous hacks, so I thought everyone will answer excluding those hacks, my bad, no one is a mind reader. but thanks for your concern. Sep 7, 2016 at 5:31
  • @PavelSayekat no problem. That's ok :)
    – Anwar
    Sep 7, 2016 at 5:32
  • 1
    If you want to capture stderr output as well make that some_command |& tee output_file.txt. I think |& is a csh-ism, but it works in modern bash and is easier than the 2>&1 thing. Sep 7, 2016 at 11:00
9

The tee command is good for capturing output from non-interactive commands. For interactive terminal applications, the package bsdutils gives you script command that allows recording the output to terminal while allowing you to interact with the application like usual. The difference between the two is that script will give the application the impression of running under a terminal and this might make a difference how the utility behaves. Also, script captures standard error without requiring to do additional redirects in the shell command line.

You can use it like this:

$ script -c script.sh output.log

(where script.sh is assumed to be found in $PATH) or

$ script -c "script.sh arguments" output.log

Running it without -c "${command}" option will run shell and allows saving the shell session to a file.

As bsdutils is an "essential" package and its priority is "required" you might have it already installed. Just try issuing command script (followed by exit to stop recording to the default file typescript).

In general I personally usually prefer script over tee though many interactive terminal applications seem to run just fine when output is piped to tee.

6
  • @PavelSayekat as far as I know, that package comes with Ubuntu by default, so you should already have script command installed. The name of the package is exactly that - bsdutils. My apt-cache search bsdutils finds it alright, so maybe you did a typo or something , but it's definitely there , and it's part of main repository Sep 7, 2016 at 9:03
  • script is a very useful tool, particularly in combination with ansifilter or the like. Just be careful when using it with tools like tmux or GNU screen. In those cases, start script first and don't do anything fancy with the multiplexer.
    – kojiro
    Sep 7, 2016 at 11:00
  • @Serg yep, I have noticed that too, it is preinstalled in my system, but the typo was from the answer poster :) Sep 7, 2016 at 17:38
  • @FooF when I run like $ script -c test.sh output.log, the command does not recognizes my test.sh script, but the test.sh script runs good on its own when I run it, :) Sep 8, 2016 at 5:23
  • 1
    @PavelSayekat This is because test.sh is probably not located in any of the directories listed in $PATH variable. -c will accept any command that is located in any directories listed in $PATH. To run script that is in your current directory, you need to either do script -c ./test.sh output.log or ` script -c "bash test.sh" output.log` . Possible other issue is that you did not make script executable , so use chmod +x test.sh Sep 8, 2016 at 5:56
9

You can use tee

For example,

./script.sh | tee logfile

will cause the output of the script to be saved in logfile as well as shown in the terminal output.

If you want to store all outputs of subsequent script executions, you may want to append to that file. In that case, you'd use tee -a instead

./script.sh | tee -a logfile
./script2.sh | tee -a logfile

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