![](https://seccdn.libravatar.org/avatar/7b33cb1e776e35b87edb8ef09f0c888f.jpg?s=120&d=mm&r=g)
Hallo, On Sat, 06 Sep 2003, Dieter Kroemer schrieb:
anfang="df -h /dev/hdb1"
ende=`$anfang` [..] aber wenn ich in die df-Zeile noch ein "|" einbaue, also z.B. ... anfang="df -h /dev/hdb1|tail -n 1"
ende=`$anfang` [..] erhalte ich ein: df: Ungültige Option -- n [..] Die Zeile df -h /dev/hdb1|tail -n 1 an der Konsole eingetippt funktioniert hingegen problemlos.
Dein Problem ist die Art, in der die shell die Kommandos auswertet. Es wird die der gesamte Variableninhalt als _ein_ Kommando betrachtet, mithin wird alles inklusive und nach der Pipe als weitere Argumente an den ersten Befehl uebergeben: ==== set -x a="date '+%s %T' | cut -d' ' -f2" x=`$a` ==== + a=date '+%s %T' | cut -d' ' -f2 ++ date ''\''+%s' '%T'\''' '|' cut '-d'\''' ''\''' -f2 ^^^^... das alles bekommt date noch als Argument/Option uebergeben, da $a als _ein_ Kommando angesehen wird. Loesung1: ein erneutes Auswerten der Kommandozeile, und somit der Pipe erzwingen: ==== set -x a="date '+%s %T' | cut -d' ' -f2" x=`eval "$a"` sleep 2 y=`eval "$a"` echo "x='$x', y='$y'" ==== ==== + a=date '+%s %T' | cut -d' ' -f2 ++ eval 'date '\''+%s %T'\'' | cut -d'\'' '\'' -f2' +++ date '+%s %T' +++ cut '-d ' -f2 + x=19:11:15 [..] x='19:11:15', y='19:11:17' ==== Wie man sieht, werden nun also 2 durch eine pipe verbundene Kommandos ausgefuehrt... Loesung2: verwende eine Funktion statt einer Variablen: ==== set -x a() { date '+%s %T' | cut -d' ' -f2; } x=`a` sleep 2 y=`a` echo "x='$x', y='$y'" ==== Das ist wohl die "sauberste" Loesung... -dnh -- [OE] Zusätzlich muß man auf automatischen Zeilenumbruch sowie automatisch eingefügte Signaturen verzichten und bei Antworten auf qp-codierte Artikel das Quoting manuell nachbearbeiten. Da kann man seine Artikel auch gleich per telnet localhost 119 einliefern. [Marc Haber in dcsn]