How to escape a NULL byte as an argument to a shel

2020-03-29 05:10发布

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?

4条回答
爷、活的狠高调
2楼-- · 2020-03-29 05:38

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
查看更多
啃猪蹄的小仙女
3楼-- · 2020-03-29 05:49

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"
查看更多
我欲成王,谁敢阻挡
4楼-- · 2020-03-29 05:54

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`
=> ""
查看更多
手持菜刀,她持情操
5楼-- · 2020-03-29 05:57

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.

查看更多
登录 后发表回答