Parece que bash, y también dash, filtran cualquier ASCII NUL de mis scripts.¿Por qué se eliminan todos los NUL de mi script?
$ printf 'test="\000a" ; echo ${#test}' | sh
1
$ printf 'test="\001a" ; echo ${#test}' | sh
2
$ printf 'ec\000ho test' | sh
test
$ # (Same for bash)
Aunque estoy de acuerdo que el uso de NUL es una mala mala idea (por ejemplo, argumento que pasa a programas funciona con cadenas terminadas en nulo), no veo donde este comportamiento es sancionado por the POSIX standard.
Se pone aún peor cuando este comportamiento decide la corrección sintáctica del archivo.
$ 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
\
Qué parte esencial me he perdido, o es el NUL de eliminación sólo una decisión sobre cómo hacer frente a un comportamiento no especificado?
Todas las implementaciones de sh Estoy familiarizado con el uso de cadenas en C, que, al estar terminados en NUL, son por su naturaleza incapaces de mantener los valores NUL. –
zsh maneja muy bien todos estos casos de prueba. –
También trataría de preguntar a Unix & Linux, si la respuesta de @ CharlesDuffy no es suficiente. – twmb