Puede guardar y asignar a IFS según sea necesario. No hay nada de malo en hacerlo. No es raro guardar su valor para la restauración posterior a una modificación rápida y temporal, como su ejemplo de asignación de matriz.
Como @llua menciona en su comentario a su pregunta, simplemente deshabilitar IFS restaurará el comportamiento predeterminado, equivalente a asignar una nueva línea de tabulación de espacio.
Vale la pena considerar cómo puede ser más problemático no establecer / deshabilitar explícitamente IFS de lo que es hacerlo.
Desde la edición POSIX 2013, 2.5.3 Variables de Shell :
Las implementaciones pueden ignorar el valor de IFS en el entorno, o la ausencia de IFS del entorno, en el momento en que se invoca el shell, en cuyo caso el shell establecerá IFS en <space> <tab> <newline> cuando se invoca .
Un shell invocado compatible con POSIX puede o no heredar IFS de su entorno. De esto sigue:
- Un script portátil no puede heredar de manera confiable IFS a través del entorno.
- Una secuencia de comandos que tiene la intención de usar solo el comportamiento de división predeterminado (o unión, en el caso de
"$*"
), pero que puede ejecutarse bajo un shell que inicializa IFS desde el entorno, debe establecer / deshabilitar explícitamente IFS para defenderse de la intrusión ambiental.
Nota: es importante comprender que para esta discusión la palabra "invocado" tiene un significado particular. Un shell se invoca solo cuando se llama explícitamente con su nombre (incluido un #!/path/to/shell
shebang). Un subshell, como podría ser creado por $(...)
o cmd1 || cmd2 &
, no es un shell invocado, y su IFS (junto con la mayoría de su entorno de ejecución) es idéntico al de su padre. Un shell invocado establece el valor de $
su pid, mientras que los subshells lo heredan.
Esto no es simplemente una disquisición pedante; Existe una divergencia real en esta área. Aquí hay un breve script que prueba el escenario utilizando varios shells diferentes. Exporta un IFS modificado (establecido en :
) a un shell invocado que luego imprime su IFS predeterminado.
$ cat export-IFS.sh
export IFS=:
for sh in bash ksh93 mksh dash busybox:sh; do
printf '\n%s\n' "$sh"
$sh -c 'printf %s "$IFS"' | hexdump -C
done
IFS generalmente no está marcado para exportación, pero, si lo fuera, tenga en cuenta cómo bash, ksh93 y mksh ignoran su entorno IFS=:
, mientras que dash y busybox lo respetan.
$ sh export-IFS.sh
bash
00000000 20 09 0a | ..|
00000003
ksh93
00000000 20 09 0a | ..|
00000003
mksh
00000000 20 09 0a | ..|
00000003
dash
00000000 3a |:|
00000001
busybox:sh
00000000 3a |:|
00000001
Alguna información de la versión:
bash: GNU bash, version 4.3.11(1)-release
ksh93: sh (AT&T Research) 93u+ 2012-08-01
mksh: KSH_VERSION='@(#)MIRBSD KSH R46 2013/05/02'
dash: 0.5.7
busybox: BusyBox v1.21.1
Aunque bash, ksh93 y mksh no inicializan IFS desde el entorno, reexportan sus IFS modificados.
Si por alguna razón necesita pasar IFS de forma portátil a través del entorno, no puede hacerlo utilizando el propio IFS; necesitará asignar el valor a una variable diferente y marcar esa variable para exportar. Luego, los niños deberán asignar explícitamente ese valor a su IFS.