Para muchos intérpretes de línea de comandos (“shell”) de sistemas operativos Unix , los separadores de campo de entrada o separadores de campo internos o la variable de shell $IFS contienen caracteres utilizados para separar el texto en tokens.
El valor de IFS (en el shell bash) normalmente incluye los caracteres de espacio , tabulación y nueva línea de forma predeterminada. Estos caracteres de espacio en blanco se pueden visualizar emitiendo el comando "declarar" en el shell bash o imprimiendo IFS con comandos como , o (los dos últimos comandos solo están disponibles en algunos shells y en algunos sistemas).printf %s "$IFS" | od -c
printf "%q\n" "$IFS"
printf %s "$IFS" | cat -A
De la página del manual de Bash , versión 4 :
El shell trata cada carácter de $IFS como un delimitador y divide los resultados de las otras expansiones en palabras sobre estos caracteres. Si IFS no está definido, o su valor es exactamente <space><tab><newline> , el valor predeterminado, entonces las secuencias de <space> , <tab> y <newline> al principio y al final de los resultados de las expansiones anteriores se ignoran, y cualquier secuencia de caracteres IFS que no esté al principio o al final sirve para delimitar palabras. Si IFS tiene un valor distinto del valor predeterminado, entonces las secuencias de los caracteres de espacio en blanco espacio y tabulación se ignoran al principio y al final de la palabra, siempre que el carácter de espacio en blanco esté en el valor de IFS (un carácter de espacio en blanco IFS ). Cualquier carácter en IFS que no sea un espacio en blanco IFS , junto con cualquier carácter de espacio en blanco IFS adyacente , delimita un campo. Una secuencia de caracteres de espacio en blanco IFS también se trata como un delimitador. Si el valor de IFS es nulo, no se produce ninguna división de palabras.
Según las especificaciones básicas de Open Group, IFS es una abreviatura de "separadores de campos de entrada". [1] Una versión más reciente de esta especificación menciona que "este nombre es engañoso ya que los caracteres IFS se utilizan en realidad como terminadores de campo". [2] Sin embargo, a menudo se hace referencia a IFS como "separadores de campos internos".
IFS se podía usar como exploit en algunas versiones de Unix. Un programa con permisos de root podía ser engañado para ejecutar código proporcionado por el usuario si se ejecutaba (por ejemplo) system("/bin/mail")
y se lo llamaba con $IFS configurado en "/" , en cuyo caso ejecutaría el programa " bin " (en el directorio actual y, por lo tanto, escribible por el usuario) con permisos de root. [3] Esto se ha solucionado haciendo que los shells no hereden la variable IFS.