如何将NULL字节作为参数转义为Makefile中的shell命令

时间:2013-06-14 09:23:32

标签: shell null makefile escaping

在Makefile中我运行一个shell命令,我想传递一个NULL字节作为参数。以下尝试失败:

echo $(shell /bin/echo -n $$'\x00' | ruby -e "puts STDIN.read.inspect")

它生成:

echo "$\\x00"

相反,我预计:

echo "\u0000"

如何正确转义这样的NULL字节?

4 个答案:

答案 0 :(得分:6)

echo默认禁用反斜杠转义的解释。您需要提供-e选项才能启用它。

$ echo -ne "\x00" | ruby -e "puts STDIN.read.inspect"
"\u0000"

答案 1 :(得分:3)

由于execve(2)语义,无法传递包含空字节的字符串作为参数。每个参数字符串都以空字节结束,因此无法区分包含的空字节和字符串的结尾。

答案 2 :(得分:0)

echo的这些用法完全不可移植。使用printf,除了最简单的字符串之外,它更容易使用,而且更加便携。

$ cat makefile
all:
        printf '\0' > foo.out
        od -a foo.out

$ make
printf '\0' > foo.out
od -a foo.out
0000000 nul
0000001

答案 3 :(得分:0)

如果有其他人来到这里寻找如何通过ruby反引号中的shell命令来逃避null:

irb(main):024:0> `curl --silent http://some-website-or-stream.com | sed 's/\\x0//g' 1>&2`
=> ""