Nel bash-scripting, può capitare di aver a che fare con dei path all’interno di variabili. Vediamo come utilizzarli evitando brutte sorprese.
Supponiamo di voler cercare tutti i file con una certa estensione in un percorso, per esempio con:
find /mnt/MEDIA/Film/ -name \*.avi -o -name \*.mkv -o -name \*.mp4
Questo comando potrebbe ritornare un elenco di path contente diversi spazi:
/mnt/MEDIA/Film/Ritorno al Futuro (1985).mp4
/mnt/MEDIA/Film/Fuga per la vittoria (1981).mkv
/mnt/MEDIA/Film/Sister Act 2 (1993).mp4
/mnt/MEDIA/Film/Gremlins 2 - La nuova stirpe (1990).mp4
se volessimo effettuare un loop su questo elenco potremmo avere comportamenti inaspettati.
Per esempio, un ciclo for su questo elenco salvato nel file esempio.txt, restituisce questo output:
for path in $(cat esempio.txt)
do
echo $path
done
/mnt/MEDIA/Film/Ritorno
al
Futuro
(1985).mp4
/mnt/MEDIA/Film/Fuga
per
la
vittoria
(1981).mkv
/mnt/MEDIA/Film/Sister
Act
2
(1993).mp4
/mnt/MEDIA/Film/Gremlins
2
-
La
nuova
stirpe
(1990).mp4
Non esattamente quello che serve a noi!
Questo avviene perchè bash utilizza un Internal Field Separator (IFS appunto), cioè una variabile speciale che identifica gli spazi di questo output come separatori e quindi spezza la riga ottenuta in più sotto-stringhe.
Per mantenere completa la riga, è sufficiente inizializzare la variabile speciale $IFS:
IFS=$'\n'
for path in $(cat esempio.txt)
do echo $path
done
/mnt/MEDIA/Film/Ritorno al Futuro (1985).mp4
/mnt/MEDIA/Film/Fuga per la vittoria (1981).mkv
/mnt/MEDIA/Film/Sister Act 2 (1993).mp4
/mnt/MEDIA/Film/Gremlins 2 - La nuova stirpe (1990).mp4