sala@home:~$

IFS

Egy korábbi bejegyzésben mutattam egy scriptet, ami fájlokat nevez át kisbetűssé:

for i in *.JPG; do mv $i `echo $i | tr A-Z a-z`; done

Ha a scriptet lefuttatjuk egy alkönyvtárban, melyben a következő 2 jpg fájl található:

A.JPG
 B C.JPG

akkor sajnos hibaüzenetet kapunk:

mv: target `c.jpg' is not a directory

A hibaüzenetből rájöhetünk, hogy a problémát a második fájl nevében található szóköz karakter okozza ( személy szerint én mindig próbálom elkerülni a szóköz használatát a fájlnevekben). Az IFS (Internal Field Separator) környezeti változó alapján dönti el a bash, hogy milyen karaktereket tekintsen szeparáló karakternek. Mivel alapértelmezés szerint a szóköz is szeparáló karakter, ezért rossz helyen “törik el” a parancsunk. Először is nézzük meg, mi az IFS környezeti változó alapértelmezése! Ha a szokásos módon

echo

paranccsal iratjuk ki a tartalmát, akkor nem leszünk okosabbak:

[gep]$ echo $IFS
 
 [gep]$

Mivel IFS alapértelmezésben speciális karaktereket tartalmaz ( szóköz, tab, újsor ), nem látunk semmit. Ehelyett inkább a következő módon nézzük meg a változó tartalmát:

[gep]$ printf "%q\n" "$IFS"
 $' \t\n'
 [gep]$

Ha módosítjuk IFS értékét, hogy a szóközt ne tartalmazza:

IFS=$'\t\n'

, akkor már rendben lefut a scriptünk.