2012-08-07 11 views
11

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?

+5

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. –

+2

zsh maneja muy bien todos estos casos de prueba. –

+0

También trataría de preguntar a Unix & Linux, si la respuesta de @ CharlesDuffy no es suficiente. – twmb

Respuesta

6

La sección de archivos de entrada en el estándar para sh estados:

El archivo de entrada deberá ser un archivo de texto, excepto que las longitudes de línea será ilimitada. Si el archivo de entrada está vacío o consiste únicamente en líneas en blanco o comentarios, o ambos, sh deberá salir con un estado de salida cero.

El término "archivo de texto" se define en la sección 3.395 here como:

Un archivo que contiene caracteres organizados en cero o más líneas. Las líneas no contienen caracteres NUL y ninguna puede superar {LINE_MAX} bytes de longitud, incluido el < carácter de nueva línea >. Aunque POSIX.1-2008 no distingue entre archivos de texto y archivos binarios (consulte el estándar ISO C), muchas utilidades solo producen resultados predecibles o significativos cuando se trabaja en archivos de texto. Las utilidades estándar que tienen tales restricciones siempre especifican "archivos de texto" en sus secciones STDIN o INPUT FILES

Si la entrada no es un archivo de texto (que no lo es si contiene cero bytes), el comportamiento no es significativo ni predecible

+0

+1 Parece lo que estaba buscando. Eso significa que lo mejor sería que las implementaciones aborten en NUL, creo. –

Cuestiones relacionadas