vacia tipo sirve representa que programacion para operaciones nulo manejo dato cual con caracteres caracter cadenas cadena string bash echo expansion dollar-sign

tipo - para que sirve string en programacion



¿Por qué $ ''/ 0'' o $ ''/ x0'' es una cadena vacía? Debería ser el carácter nulo, ¿no? (3)

bash permite $'' string '' expansión $'' string '' . Mi man bash dice:

Las palabras de la forma $'' string '' se tratan especialmente. La palabra se expande a la string , con caracteres de escape de barra invertida reemplazados según lo especificado por el estándar ANSI C. Las secuencias de escape de barra invertida, si están presentes, se decodifican de la siguiente manera:
/a alerta (campana)
/b retroceso
/e
/E un personaje de escape
/f form feed
/n nueva linea
/r retorno del carro
/t pestaña horizontal
pestaña vertical
/ barra invertida
/' comilla simple
/" comillas dobles
/ nnn el carácter de ocho bits cuyo valor es el valor octal nnn (uno a tres dígitos)
/x HH el carácter de ocho bits cuyo valor es el valor hexadecimal HH (uno o dos dígitos hexadecimales)
/c x un carácter control- x

El resultado expandido es de una sola cita, como si el signo de dólar no hubiera estado presente.

Pero, ¿por qué bash no convierte $''/0'' y $''/x0'' en un carácter nulo?
¿Está documentado? ¿Hay una razón? (¿Es una característica o una limitación o incluso un error?)

$ hexdump -c <<< _$''/0''$''/x1/x2/x3/x4_'' 0000000 _ 001 002 003 004 _ /n 0000007

echo da el resultado esperado:

> hexdump -c < <( echo -e ''_/x0/x1/x2/x3_'' ) 0000000 _ /0 001 002 003 _ /n 0000007

Mi versión de bash

$ bash --version | head -n 1 GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)

¿Por qué echo $''foo/0bar'' no se comporta como echo -e ''foo/0bar'' ?


Pero, ¿por qué bash no convierte $''/0'' y $''/x0'' en un carácter nulo?

Porque un carácter nulo termina una cadena.

$ echo $''hey/0you'' hey


Es un carácter nulo, pero depende de lo que quieras decir con eso.

El carácter nulo representa una cadena vacía, que es lo que se obtiene al expandirla. Es un caso especial y creo que eso está implícito en la documentación pero en realidad no está establecido.

En C el cero binario ''/0'' termina una cadena y por sí mismo también representa una cadena vacía. Bash está escrito en C, por lo que probablemente se sigue de eso.

Edición: POSIX menciona una cadena nula en varios lugares. En las "definiciones base" define una cadena nula como:

3.146 Cadena vacía (o cadena nula)
Una cadena cuyo primer byte es un byte nulo.


Es una limitación. bash no permite que los valores de cadena contengan bytes NUL interiores.

Las cadenas de caracteres Posix (y C) no pueden contener NULs interiores. Vea, por ejemplo, la definición de Posix de la cadena de caracteres (énfasis agregado):

3.92 cadena de caracteres

Una secuencia contigua de caracteres terminada por e incluyendo el primer byte nulo .

De manera similar, el estándar C es razonablemente explícito sobre el carácter NUL en las cadenas de caracteres:

§5.2.1p2 ... Un byte con todos los bits establecidos en 0, llamado el carácter nulo, deberá existir en el conjunto de caracteres de ejecución básicos; se utiliza para terminar una cadena de caracteres.

Posix prohíbe explícitamente el uso de NUL (y / ) en los nombres de archivo (XBD 3.170) o en las variables de entorno (XBD 8.1 "... se considera que terminan con un byte nulo".

En este contexto, los lenguajes de comandos de shell, incluido bash, tienden a usar la misma definición de una cadena de caracteres, como una secuencia de caracteres no NUL terminados por un solo NUL.

Por supuesto, puede pasar NUL libremente a través de tuberías bash, y nada le impide asignar una variable de shell a la salida de un programa que genera un byte NUL. Sin embargo, las consecuencias son "no especificadas" de acuerdo con Posix (XSH 2.6.3 "Si la salida contiene bytes nulos, el comportamiento no está especificado"). En bash, los NUL se eliminan, a menos que inserte un NUL en una cadena con la sintaxis de escape C de bash ( $''/0'' ), en cuyo caso el NUL terminará terminando el valor.

En una nota práctica, considere la diferencia entre las dos formas siguientes de intentar insertar un NUL en el stdin de una utilidad:

$ # Prefer printf to echo -n $ printf $''foo/0bar'' | wc -c 3 $ printf ''foo/0bar'' | wc -c 7 $ # Bash extension which is better for strings which might contain % $ printf %b ''foo/0bar'' | wc -c 7