Inside a Makefile I run a shell command which I want to pass a NULL byte as argument. The following attempt fails:
echo $(shell /bin/echo -n $$'\x00' | ruby -e "puts STDIN.read.inspect")
It generates:
echo "$\\x00"
Instead I expected:
echo "\u0000"
How do I properly escape such a NULL byte?
echo
disables interpretation of backslash escapes by default. You need to supply the -e
option to enable it.
$ echo -ne "\x00" | ruby -e "puts STDIN.read.inspect"
"\u0000"
Due to the execve(2) semantics it is not possible to pass a string containing a null byte as argument. Each argument string is terminated by null byte, therefore making it impossible to distinguish between the contained null byte and the end of the string.
These uses of echo
are totally non-portable. Use printf
, it's much easier to use for anything other than the simplest strings, and much more portable.
$ cat makefile
all:
printf '\0' > foo.out
od -a foo.out
$ make
printf '\0' > foo.out
od -a foo.out
0000000 nul
0000001
If anyone else came here looking how to escape a null via a shell command in ruby backticks:
irb(main):024:0> `curl --silent http://some-website-or-stream.com | sed 's/\\x0//g' 1>&2`
=> ""