2011-10-31 34 views
15

¿Qué significa el operador de bash < < <, como en el siguiente bloque de código? ¿Y cómo es que $ IFS sigue siendo un espacio, no un período?¿Qué significa el operador de Bash <<<?

LINE="7.6.5.4" 
IFS=. read -a ARRAY <<< "$LINE" 
echo "$IFS" 
echo "${ARRAY[@]}" 
+0

Otro uso de este operador (en lugar de tuberías con nombre con mknod) cuando necesita varias tuberías en una sola | pipline: ej. datos de eco | comando --data-on-stdin --other-data-on-fd-3 3 <<< 'other-data' – mosh

Respuesta

13

Redirige la cadena a stdin del comando.

Las variables asignadas directamente antes del comando de esta manera solo surten efecto para el proceso de comando; el caparazón permanece intacto.

+0

¿Cómo lo modifico para usar un delimitador multichar personalizado? Diga, '==>'? ¿Cómo debería citar la cadena? – gsklee

+1

No puedes. '$ IFS' siempre se interpreta como una serie de caracteres individuales. –

7

De man bash

Aquí Cuerdas Una variante de aquí documentos, el formato es:

 <<<word 

La palabra se expande y se suministra al sistema en su entrada estándar.

El . en la línea IFS es equivalente a source en bash.

Actualización: Más de man bash (Gracias gsklee, sehe)

IFS el separador de campo interno que se utiliza para la división de palabras después de la expansión y para líneas de división en palabras con la lectura incorporado comando. El valor predeterminado es "<space><tab><new‐line>".

aún más de man bash

El entorno para cualquier simple comando o función puede ser aumentada temporalmente prefijándolo con asignaciones de parámetros, como se describe anteriormente en parámetros. Estas declaraciones de asignación afectan solo al entorno visto por ese comando.

+2

El '.' parece una forma de definir un delimitador personalizado para' $ LINE' – gsklee

+1

http://tldp.org/LDP/abs/html/internalvariables.html # IFSREF – sehe

2

La razón de que IFS no se está estableciendo es que fiesta no está viendo que con un comando aparte ... que necesita para poner un avance de línea o un punto y coma después de la orden con el fin de darlo por terminado:

$ cat /tmp/ifs.sh 
LINE="7.6.5.4" 
IFS='.' read -a ARRAY <<< "$LINE" 
echo "$IFS" 
echo "${ARRAY[@]}" 

$ bash /tmp/ifs.sh 


7 6 5 4 

pero

$ cat /tmp/ifs.sh 
LINE="7.6.5.4" 
IFS='.'; read -a ARRAY <<< "$LINE" 
echo "$IFS" 
echo "${ARRAY[@]}" 

$ bash /tmp/ifs.sh 
. 
7 6 5 4 

no no estoy seguro de por qué hacerlo de la primera vía fue un error de sintaxis sin embargo.

+2

Porque la primera forma es cómo establece temporalmente los vars de un solo comando. Se restablecen automáticamente a sus valores anteriores cuando se completa ese comando. Lo uso todo el tiempo para establecer indicadores de depuración o lo que tienes, pero solo temporalmente. – Tanktalus

+0

Esta es información muy útil, ¡gracias! =) – gsklee