Linux^2

Linux^2

What you may find here

In this blog you'll mainly find all things Linux - problems, solutions, reports, rants, tips & tricks etc. with the occasional off-topic entry thrown in. You never would have guessed looking at the URL, huh?
In diesem Blog findet ihr hauptsächlich Themen rund um Linux - Probleme, Lösungen, Berichte, Meinungen, Tips & Tricks und dazwischen ein paar überhaupt nicht dazu passende Einträge. Wärt ihr bei der URL nie drauf gekommen, ne?

Mailt mal! Email me!

bash: read unterstützt Zeilen mit NULL-Ende

LinuxPosted by Jochen Mon, June 27, 2011 10:29:44
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