Bash $IFS

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

Leave a Reply

Your email address will not be published. Required fields are marked *

© 2024 Bertorello.info | WordPress Theme : ScrollMe

By continuing to use the site, you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close