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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

© 2020 MarcoBertorello.it | WordPress Theme : ScrollMe
%d blogger hanno fatto clic su Mi Piace per questo:

Utilizzando il sito, accetti l'utilizzo dei cookie da parte nostra. maggiori informazioni

Questo sito utilizza i cookie per fornire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o cliccando su "Accetta" permetti il loro utilizzo.

Chiudi