在Makefile中我运行一个shell命令,我想传递一个NULL字节作为参数。以下尝试失败:
echo $(shell /bin/echo -n $$'\x00' | ruby -e "puts STDIN.read.inspect")
它生成:
echo "$\\x00"
相反,我预计:
echo "\u0000"
如何正确转义这样的NULL字节?
答案 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`
=> ""