Fehler bei extglob

28/11/2008 - 18:24 von t_pot | Report spam
Ich habe bei der c't (Heise, 0711-206.zip) nachstehendes Skript
aufgestöbert, das nicht so tut, wie's soll (wg. Verstàndnisproblemen
etwas lànger). Es führt evtl. anstehende Datei-System Checks beim
Shutdown aus.

8<-->8
function GetValue
{
shopt -s extglob
if [ -z "$1" -o -z "$2" ]; then
echo ""
return 1
fi
Label=$1
Text=$2
Value=${!Label/*${Text}*( )}
echo ${Value%%$''*}
}
#Nur Laufwerke aus /etc/fstab berücksichtigen
exec 3</etc/fstab
# /etc/fstab zeilenweise einlesen
while read -u 3 Fstab; do
# Kommentare entfernen
Fstab=${Fstab/\#*}
# Zeile in die einzelnen Felder auftrennen
set -- ${Fstab}
Drive=$1
Mountpoint=$2
FsType=$3
FsOptions=$4
# Nur Ext3- und Ext2-Partitionen werden überprüft
if [ "${FsType}" != "ext3" -a "${FsType}" != "ext2" ]; then
continue
[...]

Das Skript steigt schon bei der Deklaration der Funktion mit einer
Fehlermeldung aus. Dazu habe ich per Google folgendes gefunden:

8<-->8
/Re: "shopt -s extglob" inside of a function does not work/

Nope. Will not work, cannot work. A function definition is parsed
in its entirety before any commands within are executed. Since the
extglob option changes the behavior of the parser, it must be enabled
before trying to parse the function.
8<-->8

Tatsàchlich verschwindet der Fehler, wenn man *shopt -s extglob* vor die
Funktions-Deklaration setzt. Ist da was übersehen worden bei der c't?
Die *()* bei *function GetValue* fehlen übrigens auch.

Und könnte jemand mal aufdröseln, was genau in dieser Deklaration
"veranstaltet" wird. Da bin ich nàmlich trotz Tante Google nicht
wirklich hintergestiegen.

Anyway: Nach dieser Korrektur kommt der nàchste "Hànger" bei *while read
-u 3 Fstab*.

Das verstehe ich schon eher, denn /read/ kennt doch die Option *-u*
überhaupt nicht und meckert entsprechend.

Was passiert denn hier überhaupt? Zunàchst wird mittels /exec
3</etc/fstab/ besagte Datei via Kanal 3 zum Lesen geöffnet - korrekt?

Aber: Verlàsst ein *exec* nicht die aufrufende Shell und kehrt niemals
wieder zurück zu derselben?

Das "while-Konstrukt" soll dann wohl *fstab* zeilenweise parsen und in
der Variablen *Fstab* ablegen, oder? - Tut aber nicht wegen des *-u3*.

TIA,

Thomas Pothmann
PGP-Key on demand
 

Lesen sie die antworten

#1 Heike C. Zimmerer
29/11/2008 - 18:06 | Warnen spam
(Thomas Pothmann) writes:

Ich habe bei der c't (Heise, 0711-206.zip) nachstehendes Skript
aufgestöbert, das nicht so tut, wie's soll (wg. Verstàndnisproblemen
etwas lànger). Es führt evtl. anstehende Datei-System Checks beim
Shutdown aus.



(Skript weggelassen) Es handelt sich um ein Bash-Skript. Mit einer
anderen Shell hast Du - so wie es geschrieben ist - keine Chancen.

Tatsàchlich verschwindet der Fehler, wenn man *shopt -s extglob* vor die
Funktions-Deklaration setzt. Ist da was übersehen worden bei der c't?



Wohl schon. Nicht nur hier, andere Stellen sind auch etwas - sagen wir
mal - wenig elegant formuliert.

Die *()* bei *function GetValue* fehlen übrigens auch.



'function' für sich ist überflüssig, auch wenn's die Bash akzeptiert.
Eine portable Funktionsdefinition besteht nur aus dem Namen mit
nachfolgendem (). Das versteht jede Bourne-artige Shell. Es gibt keinen
guten Grund, es anders zu machen.

Anyway: Nach dieser Korrektur kommt der nàchste "Hànger" bei *while read
-u 3 Fstab*.

Das verstehe ich schon eher, denn /read/ kennt doch die Option *-u*
überhaupt nicht und meckert entsprechend.



Der 'read' der Bash schon. Um den Input eines Blocks (wie einer
Schleife) umzuleiten, tàte es allerdings eine simple Umleitung des
Blocks, für die while-Schleife also

while ...; do

done < /etc/fstab

Was passiert denn hier überhaupt? Zunàchst wird mittels /exec
3</etc/fstab/ besagte Datei via Kanal 3 zum Lesen geöffnet - korrekt?



Ja.

Aber: Verlàsst ein *exec* nicht die aufrufende Shell und kehrt niemals
wieder zurück zu derselben?



wenn ein Kommandozeilenargument folgt, schon. Da keins da ist, wird nur
die Umleitung ausgeführt.

Das "while-Konstrukt" soll dann wohl *fstab* zeilenweise parsen und in
der Variablen *Fstab* ablegen, oder? - Tut aber nicht wegen des *-u3*.



Tàte es schon mit der Bash, aber die ganze exec/-u3 - Konstruktion ist
etwas umstàndlich gewàhlt, siehe while-Beispiel oben.

Gruß,

Heike

Ähnliche fragen