Gerektiğinde IFS'ye kaydedebilir ve atayabilirsiniz. Bunu yapmakta yanlış bir şey yok. Dizi atama örneğiniz gibi, geçici, hızlı bir modifikasyonun ardından restorasyon değerini kaydetmek nadir değildir.
@Llua, sorunuza yaptığı yorumda belirtildiği gibi, IFS'nin ayarının kaldırılması, boşluk sekmesi-satırsonu atamaya eşdeğer olan varsayılan davranışı geri yükleyecektir.
O daha sorunlu olabilir nasıl dikkate It yetmeyecek değil bunu yapmak için daha açık bir şekilde ayarlanabilir / tanımsız IFS.
POSIX 2013 sürümünden, 2.5.3 Kabuk Değişkenleri :
Uygulamalar, kabuk çağrıldığında ortamdaki IFS'nin değerini veya ortamdan IFS'nin yokluğunu göz ardı edebilir; bu durumda kabuk, çağrıldığında IFS'yi <boşluk> <tab> <newline> olarak ayarlayacaktır. .
POSIX uyumlu, çağrılan bir kabuk IFS'yi ortamından devralabilir veya devralmayabilir. Bundan:
- Taşınabilir bir komut dosyası, ortam üzerinden IFS'yi güvenilir bir şekilde devralamaz.
- Yalnızca varsayılan bölme davranışını kullanmayı amaçlayan (veya durumda katılma
"$*") ancak IFS'yi ortamdan başlatan bir kabuk altında çalışabilen bir komut dosyasının, IFS'yi çevresel saldırılara karşı savunmak için açıkça ayarlaması / ayarlaması gerekir.
Not: Bu tartışma için "çağrılan" kelimesinin özel bir anlamı olduğunu anlamak önemlidir. Bir kabuk sadece ismini kullanarak açıkça adlandırıldığında (bir #!/path/to/shellshebang dahil ) çağrılır . Alt kabuk - $(...)veya tarafından oluşturulabileceği gibi cmd1 || cmd2 &- çağrılan bir kabuk değildir ve IFS (yürütme ortamının çoğuyla birlikte) ebeveynininkiyle aynıdır. Çağrılan bir kabuk, değerini kabuklarına ayarlarken, $alt kabuklar onu devralır.
Bu sadece bilgiçliksel bir keşif değildir; bu alanda gerçek farklılıklar var. İşte senaryoyu birkaç farklı kabuk kullanarak test eden kısa bir komut dosyası. Değiştirilmiş bir IFS'yi (olarak ayarlanmış :) çağrılan bir kabuğa verir ve daha sonra varsayılan IFS'yi yazdırır.
$ 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 genellikle dışa aktarma için işaretlenmez, ancak öyleyse bash, ksh93 ve mksh'nin ortamlarını nasıl yok saydığına dikkat edin IFS=:, çizgi ve meşgul kutusu onurlandırır.
$ 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
Bazı sürüm bilgileri:
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
Bash, ksh93 ve mksh, IFS'yi ortamdan başlatmasalar da, değiştirilmiş IFS'lerini yeniden dışa aktarırlar.
Herhangi bir nedenden ötürü IFS'yi çevre yoluyla portatif olarak geçirmeniz gerekiyorsa, IFS'nin kendisini kullanarak bunu yapamazsınız; değeri farklı bir değişkene atamanız ve bu değişkeni dışa aktarma için işaretlemeniz gerekir. Çocukların bu değeri IFS'lerine açıkça atamaları gerekecektir.