为什么从我的脚本中删除所有NUL?

Jo *_* So 11 bash sh

它似乎是bash,也是破折号,从我的脚本中过滤掉任何ASCII NUL.

$ printf 'test="\000a" ; echo ${#test}' | sh
1
$ printf 'test="\001a" ; echo ${#test}' | sh
2
$ printf 'ec\000ho test' | sh
test
$ # (Same for bash)
Run Code Online (Sandbox Code Playgroud)

虽然我同意使用NUL是一个坏主意(例如传递给程序的参数使用NUL终止的字符串),但我没有看到POSIX标准批准这种行为的位置.

当此行为决定文件的语法正确性时,情况会变得更糟.

$ printf 'echo "\\\000"' | sh
sh: Syntax error: Unterminated quoted string
$ printf 'echo "\\\000"' | bash
bash: line 1: unexpected EOF while looking for matching `"'
bash: line 2: syntax error: unexpected end of file
$ printf 'echo "\\\134"' | sh
\
Run Code Online (Sandbox Code Playgroud)

我错过了什么重要的部分,或者NUL的删除只是决定如何应对未指明的行为?

Wil*_*ell 6

sh状态标准中的INPUT FILES部分:

输入文件应为文本文件,但行长度不受限制.如果输入文件为空或仅由空行或注释组成,或两者都有,则sh应以零退出状态退出.

术语"文本文件"是在第3.395定义在这里为:

包含组织为零行或多行的字符的文件.这些行不包含NUL字符,长度不能超过{LINE_MAX}个字节,包括<newline>字符.尽管POSIX.1-2008不区分文本文件和二进制文件(请参阅ISO C标准),但许多实用程序在操作文本文件时仅产生可预测或有意义的输出.具有此类限制的标准实用程序始终在其STDIN或INPUT FILES部分中指定"文本文件"

如果输入不是文本文件(如果它包含零字节则不是),则该行为既不有意义也不可预测.