Linux writing console output to a file - linux

I have a large amount of prints on the console and I want to store them into a file. Can anyone suggest a way in Linux?

your_print_command > filename.txt
Or
your_print_command >> filename.txt
The latter appends data into file instead of overriding it.

To make sure you get both stderr and stdout to the file instead of the console
command_generating_text &> /path/to/file
To keep stderr and stdout to different files
command_generating_text 1> /path/to/file.stdout 2> /path/to/file.stderr

Related

How does the Windows command type work

So I think "cat" in Linux actually concatenates files as 2 chunks of memory(hopefully). My concern is the "type" command in Windows, judging by the name I believe it may read and write the files, to a new file. I don't know how much time this will take if it does this.
This is how its used (just like cat it combines both files to the out file):
type file_name1.txt file_name2.txt >> out.txt
No. cat in Linux works by reading all the files in the command line and writing them in the standard output. If the command line is empty it will read the standard input.
So when you run:
cat file1 file2 >> file3
It reads file1 and writes it to stdout. When finished, it reads file2 and writes it to stdout too. But, ah!, the shell has redirected stdout to append to file3, so that is where both files are written.
And type in Windows works basically the same, except that the command line cannot be empty (for that you can use copy CON).
Now, cat command in Linux may have a few optimizations to avoid too many copies of the data in memory, such as splice(2) but that should be viewed as an optional optimization.
Like the Linux cat, the Windows cmd.exe shell type command will read both files and write them to stdout.
Unlike Linux cat, it will add filename headers through stderr. If you want the same effect, be sure to redirect stderr.
type file1.txt file2.txt 2>NUL
And, if you want to redirect stdout, be sure to do it -before- redirecting stderr.
type file1.txt file2.txt >newfile.txt 2>NUL

Difference between stdout and /dev/stdout

bala#hp:~$ echo "Hello World" > stdout
bala#hp:~$ cat stdout
Hello World
bala#hp:~$ echo "Hello World" > /dev/stdout
Hello World
Kindly clarify what is the difference between stdout and /dev/stdout
Note :
bala#hp:~$ file stdout
stdout: ASCII text
bala#hp:~$ file /dev/stdout
/dev/stdout: symbolic link to `/proc/self/fd/1'
Kindly help to know the difference .
In your case
stdout is a normal file, created in the same directory where you're running the command.
So, when you're redirecting the output of echo to stdout, it is written to the file. You need to do cat (as example, here you did) in order to see the content on screen here.
/dev/stdout is a device file, which is a link to /proc/self/fd/1, which means it is referring to the file descriptor 1 held by the current process.
So, when you're redirecting the output of echo to /dev/stdout, it is sent to the standard output (the screen) directly.
stdout on its own is just a file in the current directory, no different to finances.txt. It has nothing to do with the standard output of the process other than the fact you're redirecting standard output to it.
On the other hand, /dev/stdout is a link to a special file on the procfs file system, which represents file descriptor 1 of the process using it1.
Hence it has a very real connection to the process standard output.
1 The procfs file system holds all sorts of wondrous information about the system and all its processes (assuming a process has permissions to get to them, which it should have for /proc/self).
One is a normal file, no different from any other normal file like e.g. ~/foobar.txt.
The other is a symbolic link (like one you can create with ln -s) to a special virtual file that represents file descriptor 1 in the current process.

Redirect String to STDERR Linux Command

Let's say I have a file that contains a string. When I open it with cat file, I want the output of it to show in STDERR, not STDOUT. How can I achieve that?
cat file 1>&2
More info at: http://www.tldp.org/LDP/abs/html/io-redirection.html

How to make nohup.out update with perl script?

I have a perl script that copies a large amount of files. It prints some text to standard out and also writes a logfile. However, when running with nohup, both of these display a blank file:
tail -f nohup.out
tail -f logfile.log
The files don't update until the script is done running. Moreover, for some reason tailing the .log file does work if I don't use nohup!
I found a similar question for python (
How come I can't tail my log?)
Is there a similar way to flush the output in perl?
I would use tmux or screen, but they don't exist on this server.
Check perldoc,
HANDLE->autoflush( EXPR );
To disable buffering on standard output that would be,
STDOUT->autoflush(1);

How to pipe the output of a command to file on Linux

I am running a task on the CLI, which prompts me for a yes/no input.
After selecting a choice, a large amount of info scrolls by on the screen - including several errors. I want to pipe this output to a file so I can see the errors. A simple '>' is not working since the command expects keyboard input.
I am running on Ubuntu 9.1.
command &> output.txt
You can use &> to redirect both stdout and stderr to a file. This is shorthand for command > output.txt 2>&1 where the 2>&1 means "send stderr to the same place as stdout" (stdout is file descriptor 1, stderr is 2).
For interactive commands I usually don't bother saving to a file if I can use less and read the results right away:
command 2>&1 | less
echo yes | command > output.txt
Depending on how the command reads it's input (some programs discard whatever was on stdin before it displays it's prompt, but most don't), this should work on any sane CLI-environment.
Use 2> rather than just >.
If the program was written by a sane person what you probably want is the stderr not the stdout. You would achieve this by using something like
foo 2> errors.txt
you can use 2> option to send errors to the file.
example:
command 2> error.txt
(use of option 2>) --- see if their would be any error while the execution of the command it will send it to the file error.txt.

Resources