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 might not actually be implemented this way (it may be a FIFO (named pipe)), but that's not an entirely incorrect way of thinking about it. Reading the `bash` sources, it seems as if that particular shell implements here-documents by creating a temporary file using the `mkstemp()` library function if it's available, otherwise it tries to create a random filename to write too. See `redir.c` and `lib/sh/tmpfile.c` in the `bash` source distribution.