Vous pouvez enregistrer et affecter à IFS selon vos besoins. Il n'y a rien de mal à le faire. Il n'est pas rare d'enregistrer sa valeur pour la restauration après une modification temporaire et rapide, comme votre exemple d'affectation de tableau.
Comme @llua le mentionne dans son commentaire à votre question, la simple suppression de IFS restaurera le comportement par défaut, ce qui équivaut à attribuer un espace-tab-newline.
Cela vaut la peine de considérer comment il peut être plus problématique de ne pas explicitement définir / désinstaller IFS que de le faire.
Depuis l'édition POSIX 2013, 2.5.3 Variables du shell :
Les implémentations peuvent ignorer la valeur d'IFS dans l'environnement, ou l'absence d'IFS de l'environnement, au moment où le shell est appelé, auquel cas le shell doit définir IFS sur <space> <tab> <newline> lors de son appel. .
Un shell invoqué compatible POSIX peut ou non hériter IFS de son environnement. De cela suit:
- Un script portable ne peut pas hériter de manière fiable d'IFS via l'environnement.
- Un script qui a l'intention d'utiliser uniquement le comportement de fractionnement par défaut (ou de jointure, dans le cas de
"$*"
), mais qui peut s'exécuter sous un shell qui initialise IFS à partir de l'environnement, doit explicitement définir / désactiver IFS pour se défendre contre les intrusions environnementales.
NB Il est important de comprendre que pour cette discussion le mot "invoqué" a une signification particulière. Un shell n'est invoqué que lorsqu'il est explicitement appelé en utilisant son nom (y compris un #!/path/to/shell
shebang). Un sous-shell - tel que pourrait être créé par $(...)
ou cmd1 || cmd2 &
- n'est pas un shell invoqué, et son IFS (ainsi que la plupart de son environnement d'exécution) est identique à celui de son parent. Un shell invoqué définit la valeur de $
son pid, tandis que les sous-shell en héritent.
Ce n'est pas simplement une disquisition pédante; il existe une réelle divergence dans ce domaine. Voici un bref script qui teste le scénario à l'aide de plusieurs shells différents. Il exporte un IFS modifié (défini sur :
) vers un shell appelé qui imprime ensuite son IFS par défaut.
$ 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 n'est généralement pas marqué pour l'exportation, mais s'il l'était, notez comment bash, ksh93 et mksh ignorent leur environnement IFS=:
, tandis que dash et busybox l'honorent.
$ 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
Quelques informations de version:
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
Même si bash, ksh93 et mksh n'initialisent pas IFS à partir de l'environnement, ils réexportent leur IFS modifié.
Si, pour quelque raison que ce soit, vous devez transmettre IFS de manière portable via l'environnement, vous ne pouvez pas le faire en utilisant IFS lui-même; vous devrez affecter la valeur à une variable différente et marquer cette variable pour l'exportation. Les enfants devront ensuite attribuer explicitement cette valeur à leur IFS.