Pipe is used to pass output to another program or utility.
Redirect is used to pass output to either a file or stream.
Example: thing1 > thing2
vs thing1 | thing2
thing1 > thing2
- Your shell will run the program named
thing1
- Everything that
thing1
outputs will be placed in a file called thing2
. (Note - if thing2
exists, it will be overwritten)
If you want to pass the output from program thing1
to a program called thing2
, you could do the following:
thing1 > temp_file && thing2 < temp_file
which would
- run program named
thing1
- save the output into a file named
temp_file
- run program named
thing2
, pretending that the person at the keyboard typed the contents of temp_file
as the input.
However, that's clunky, so they made pipes as a simpler way to do that. thing1 | thing2
does the same thing as thing1 > temp_file && thing2 < temp_file
EDIT to provide more details to question in comment:
If >
tried to be both "pass to program" and "write to file", it could cause problems in both directions.
First example: You are trying to write to a file. There already exists a file with that name that you wish to overwrite. However, the file is executable. Presumably, it would try to execute this file, passing the input. You'd have to do something like write the output to a new filename, then rename the file.
Second example: As Florian Diesch pointed out, what if there's another command elsewhere in the system with the same name (that is in the execute path). If you intended to make a file with that name in your current folder, you'd be stuck.
Thirdly: if you mis-type a command, it wouldn't warn you that the command doesn't exist. Right now, if you type ls | gerp log.txt
it will tell you bash: gerp: command not found
. If >
meant both, it would simply create a new file for you (then warn it doesn't know what to do with log.txt
).
>
is used to overwrite (“clobber”) a file and >>
is used to append to a file.
Thus, when you use ps aux > file
, the output of ps aux
will be written to file
and if a file named file
was already present, its contents will be overwritten.
And if you use ps aux >> file
, the output of ps aux
will be written to file
and if the file named file
was already present, the file will now contain its previous contents and also the contents of ps aux
, written after its older contents of file
.
Best Answer
There is no difference from a user point of view. These commands do the same thing.
Technically the difference is in what program opens the file: the
cat
program or the shell that runs it. Redirections are set up by the shell, before it runs a command.(So in some other commands--that is, not the command shown in the question--there may be a difference. In particular, if you can't access
file.txt
but the root user can, thensudo cat file.txt
works butsudo cat < file.txt
does not.)You can use either one that is convenient in your case.
There are almost always many ways to get the same result.
cat
accepts a file from arguments orstdin
if there are no arguments.See
man cat
: