Hash inside Makefile shell call causes unexpected behaviour Hash inside Makefile shell call causes unexpected behaviour shell shell

Hash inside Makefile shell call causes unexpected behaviour


You have to escape the hash twice in order to use it inside functions: once for Make and once again for the shell.

That is,

FILE = $(shell echo \\\#include\ \<ham/hamsterdb.h\>)

Notice three backslashes instead of two as one could expect. The third backslash is needed because otherwise the first one would escape the second and the hash would be still unescaped.

UPD.

Another possible solution is to only escape the hash for Make and use Bash single quotes to prevent interpreting the hash as a shell comment. This also eliminates the need of escaping spaces, < and >:

FILE = $(shell echo '\#include <ham/hamsterdb.h>')


You need just a bit more quoting:

FILE=$(shell echo \\\#include\<ham/hamsterdb.h\> ...                  ^^^

Quote once for make itself, a second time for the shell (the shell needs to 'see' \#).