Al comienzo de un script de shell bash se encuentra la siguiente línea:
IFS=$'\n'
¿Cuál es el significado detrás de esta colección de símbolos?
bash
shell-script
command-line
Abdul Al Hazred
fuente
fuente
IFS=$'\n'
es un bashism (+ otros shells, use ANSI-C Quoting , para soluciones ver stackoverflow.com/questions/10748703/…Respuestas:
IFS
significa "separador de campo interno". El shell lo utiliza para determinar cómo dividir las palabras, es decir, cómo reconocer los límites de las palabras.Pruebe esto en un shell como bash (otros shells pueden manejar esto de manera diferente, por ejemplo zsh):
El valor predeterminado para
IFS
consiste en caracteres de espacio en blanco (para ser precisos: espacio, tabulación y nueva línea). Cada carácter puede ser un límite de palabra. Entonces, con el valor predeterminado deIFS
, se imprimirá el bucle anterior:En otras palabras, el shell piensa que el espacio en blanco es un límite de palabra.
Ahora, intente configurar
IFS=:
antes de ejecutar el bucle. Esta vez, el resultado es:Ahora, el caparazón también se divide
mystring
en palabras, pero ahora, solo trata los dos puntos como el límite de la palabra.El primer carácter de
IFS
es especial: se utiliza para delimitar palabras en la salida cuando se usa la$*
variable especial (ejemplo tomado de la Guía avanzada de secuencias de comandos Bash , donde también puede encontrar más información sobre variables especiales como esa):Comparar con:
Tenga en cuenta que en ambos ejemplos, la cáscara se seguirá considerando todos los personajes
:
,-
y;
como límites de las palabras. Lo único que cambia es el comportamiento de$*
.Otra cosa importante a saber es cómo la llamada "IFS espacio en blanco" es tratado . Básicamente, tan pronto como
IFS
incluye espacios en blanco, los espacios en blanco iniciales y finales se eliminan de la cadena para dividirse antes de procesarlos y una secuencia de caracteres en blanco consecutivos también delimita los campos. Sin embargo, esto solo se aplica a los caracteres de espacios en blanco que están realmente presentes enIFS
.Por ejemplo, veamos la cadena
"a:b:: c d "
(espacio final y dos caracteres de espacio entrec
yd
).IFS=:
ello se dividiría en cuatro campos:"a"
,"b"
,""
(cadena vacía) y" c d "
(de nuevo, dos espacios entrec
yd
). Tenga en cuenta los espacios en blanco iniciales y finales en el último campo.IFS=' :'
, que se divide en cinco campos:"a"
,"b"
,""
(cadena vacía),"c"
y"d"
. Sin espacios en blanco iniciales y finales en ningún lado.Observe cómo los caracteres de espacio en blanco consecutivos múltiples delimitan dos campos en el segundo ejemplo, mientras que los dos puntos consecutivos múltiples no lo hacen (ya que no son caracteres de espacio en blanco).
En cuanto a
IFS=$'\n'
, que es unaksh93
sintaxis también apoyado porbash
,zsh
,mksh
y FreeBSDsh
(con variaciones entre todas las conchas). Citando la página de manual de bash:\n
es la secuencia de escape para una nueva línea, por lo queIFS
termina configurada en un solo carácter de nueva línea.fuente
bash
guía de secuencias de comandos, o lo que sea. En general, la información disponible en enlaces como este carece de manera importante. De todos modos, se pierden dos puntos cruciales con respecto a la división de shell: el globting y el espacio en blanco IFS.unset IFS
se comporta un shell de manera muy diferenteIFS=
. También el primer byte en IFS también es especial"${named_array[*]}"
, pero tampoco importa cuando no se$IFS
es una de las dos cosas principales que se realizan al expandir una variable sin comillas en el contexto de la lista (es lasplit
parte delsplit+glob
operador). El otro es engorroso. Al usar la división de trabajo, generalmente necesita emitirset -f
para deshabilitar laglob
pieza.$IFS
también es usado por elread
comando incorporadoDentro de las comillas simples, algunos personajes son evaluados especialmente. Por ejemplo,
\n
se traduce a una nueva línea.Entonces, esta línea particular asigna nueva línea a la variable IFS. IFS, a su vez, es una variable especial en bash: separador de campo interno. Como
man bash
dice,fuente
dollared single quotes
cuál es diferente de las comillas simples.Para abreviar,
IFS=$'\n'
asigne nueva línea\n
a la variableIFS
.$'string'
construct es un mecanismo de citas que se utiliza para decodificar ANSI C como secuencias de escape. Esta sintaxis viene deksh93
, y era portátil a la cáscara moderno comobash
,zsh
,pdksh
,busybox sh
.POSIX no define esta sintaxis, pero se aceptó para el problema SUS 7 .
fuente
Preferí explicarlo
$IFS
con un ejemplo:Suponga que desea cp o mv u otro proceso de archivo, IFS está vacío por defualt, cuando sus archivos tienen metacargos o espacio como:
Linux Administration.pdf
oFree Software Fundation.ogg
, claro, tendrá un problema, porque: Linux considere un Param separado y Administartion consideran un parámetro separado. Entonces bash tienebuilt-in variable
, luego puede inicializar aIFS==$(echo -en "\n\b")
, luego bash descarta cualquier meta char y espacio entre el nombre del archivo, por ejemplo:fuente