Skip to main content
2 of 7
added 205 characters in body
Kusalananda
  • 356.1k
  • 42
  • 737
  • 1.1k

When cat is not given a filename on the command line (or if the filename is just -), then it switches to reading from its standard input.

That means that with

cat <<END something something END 

cat will notice that it was not given a filename and will proceed to read from the here-document, which is arriving on its standard input stream.

You can get cat to read from both its standard input and from a file with

cat - filename <<END something something END 

This will cause the contents of the here-document to be concatenated with the contents of filename. If the order of the arguments was filename - then that would be the order that the data would be concatenated too.

Note that - is not special in any way, and is handled in this way specifically by the cat utility. If you have an actual file called - that you need to run cat on, use cat ./-.


For all purposes, you can think of feeding a here-document directly into a utility as a shorthand for creating a temporary file and then invoking the utility with that attached to the standard input stream:

printf 'some contents' >tmpfile utility <tmpfile rm -f tmpfile 

Here-documents may not be implemented this way (it may be a FIFO (named pipe)), but that's not an entirely incorrect way of thinking about it.

Kusalananda
  • 356.1k
  • 42
  • 737
  • 1.1k