This question may sound a bit stupid, but I can not really see the difference between redirection and pipes.
Redirection is used to redirect the stdout/stdin/stderr, e.g. ls > log.txt
.
Pipes are used to give the output of a command as input to another command, e.g. ls | grep file.txt
.
But why are there two operators for the same thing?
Why not just write ls > grep
to pass the output through, isn't this just a kind of redirection also? What I am missing?
Best Answer
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
vsthing1 | thing2
thing1 > thing2
thing1
thing1
outputs will be placed in a file calledthing2
. (Note - ifthing2
exists, it will be overwritten)If you want to pass the output from program
thing1
to a program calledthing2
, you could do the following:thing1 > temp_file && thing2 < temp_file
which would
thing1
temp_file
thing2
, pretending that the person at the keyboard typed the contents oftemp_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 asthing1 > 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 youbash: 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 withlog.txt
).