Difference between "cat" and "cat <"

In the first case, cat opens the file, and in the second case, the shell opens the file, passing it as cat's standard input.

Technically, they could have different effects. For instance, it would be possible to have a shell implementation that was more (or less) privileged than the cat program. For that scenario, one might fail to open the file, while the other could.

That is not the usual scenario, but mentioned to point out that the shell and cat are not the same program.


There is no major visible difference in your test case. The most obvious one would be the error message you get if there is no file named myfile.txt in the current directory, or if you are not allowed to read it.

In the former case, cat will complain and in the latter case, your shell will, clearly showing which process is trying to open the file, cat in the former one and the shell in the latter one.

$ cat myfile.txt
cat: myfile.txt: No such file or directory
$ cat < myfile.txt
ksh93: myfile.txt: cannot open [No such file or directory]

In a more general case, a major difference is using redirections cannot be used to print the content of more than one file, which is after all the original purpose of the cat (i.e. catenate) command. Note that the shell will anyway try to open all files passed as redirected input, but only actually pass the last one to cat unless you use zsh and its multios "zshism".

$ echo one > one
$ echo two > two
$ cat one two # cat opens one, shows one, opens two, shows two
one
two
$ cat < one < two # sh opens one then opens two, cat shows stdin (two)
two
$ rm one two
$ echo one > one
$ cat one two # cat opens and shows one, fails to open two
one
cat: two: No such file or directory
$ cat < one < two # the shell opens one then opens two, fails and 
                  # displays an error message, cat gets nothing on stdin
                  # so shows nothing
ksh93: two: cannot open [No such file or directory]

On a standard system, the shell and cat have no difference in file access rights so both will succeed of fail equally. Using sudo to raise cat's privileges will make a big difference in behavior, as Thomas Dickey reply and attached comments already suggested.


cat myfile.txt reads the file myfile.txt then prints it to the standard output.

cat < myfile.txt here cat isn't given any file(s) to open, so -like many Unix commands do- reads the data from the standard input, which is directed there from file.txt by the shell, and prints to standard output.