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

时间:2012-08-07 23:12:05

标签: 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)

虽然我同意使用NUL是一个坏主意(例如,传递给程序的参数适用于NUL终止的字符串),但我不知道the POSIX standard批准此行为的位置。

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

$ 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
\

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

1 个答案:

答案 0 :(得分:6)

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

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

术语“文本文件”在3.395 here 部分中定义为:

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

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