Folgendes Problem: In einem bash-Skript sollen Eingabezeilen verarbeitet werden. Die Eingabezeilen sind aber nicht mit Newlines beendet, sondern mit Nullbytes (ASCII-NUL, \0). Außerdem können Newlines und anderer Whitespace korrekter und zu erhaltender Inhalt der Zeilen sein.

Das Whitespace-Problem ist schnell gelöst: Einfach die shellinterne Variable IFS (internal field separator) setzen. Aber wie liest man NULL-terminierte Zeilen ein?

Dieses sehr informative, aber englische Blogeintrag zum Thema bash und read bietet die Lösung. Das Shell-Builtin read versteht unter anderem die Option “-d <delim>“. Darüber kann man den Trenner für Eingabezeilen festlegen. Auch Nullbytes kann man festlegen – wenn man weiß, wie, denn der erste Anlauf ‘\0’ funktioniert nicht!

Korrekte Lösung: Einfach einen Leerstring als Delimiter übergeben.

read -d ” LINE

Im Zusammenhang sähe eine Lösung dann so aus:

# Ursprünglichen IFS sichern
OLD_IFS=”$IFS”

# IFS leeren, damit Whitespace nicht verändert wird
IFS=””

find . -print0 | while read -d ” LINE; do
# In LINE befindet sich nun eine unveränderte Ausgabezeile von find(1)
done

#Alten IFS restaurieren
IFS=”$OLD_IFS”

ich hoffe, das hilft mal irgendwem weiter.

Jochen