Von Tendenz Rot am Fr, 21. Februar 2014 um 23:22 #
Was ist nur aus dem guten alten Shell-Scripting geworden? Für diesen Trivialfall ist es mglw. nicht so von Bedeutung, aber spätestens wenn solche Pipe-Orgien in Funktionen landen, welche dann möglichst auch noch in Schleifen aufgerufen werden, dann ist Trauer angesagt. Schade das das Potential der Shell ständig unterschätzt wird. Hier mal eine Version komplett ohne grep und awk. (Funktioniert auch mit der busybox sh)
#!/bin/sh set -- $(wget --max-redirect=0 -S -qO- "$@" -O /dev/null 2>&1) while [[ $1 != "" ]]; do if [[ $1 = "Location:" ]]; then echo $2; break; fi shift done
Ist ein wenig mehr Schreibkram, aber um Längen schneller da das Suchen und Starten zusätzlicher Prozesse entfällt.
Guter Einwand! Allerdings ist zu vermuten, dass der Autor nur gelegentlich etwas Shell verwendet und daher nicht auf diesen Code kommen konnte.
Ich muss auch gestehen, dass mir trotz umfangreicher Shell-Programmierung die Konstrukte "set --" und "[[ ... ]]" nicht geläufig waren. Wieder was gelernt!
Von 10 Jahre Basherfahrung am Sa, 22. Februar 2014 um 11:22 #
help set -- Assign any remaining arguments to the positional parameters. If there are no remaining arguments, the positional parameters are unset.
Ist irgendwie genauso übel wie while.... do done < ....
Wobei diese obskuren Lösungen in bash immer zu den schnellsten gehören. In einem bash Buch (iirc vom apress Verlag) werden zig Varianten durchexerziert die Lösung mit dem < auf ein while/for war da iirc einer der schnellsten Lösungen.
Von Penguin No. 42 am Sa, 22. Februar 2014 um 15:09 #
Ist ein wenig mehr Schreibkram, aber um Längen schneller da das Suchen und Starten zusätzlicher Prozesse entfällt.
Mag sein, das es um Längen schneller ist, aber mit dem "mehr an Schreibkram" hast du den Geschwindigkeitsvorteil deines Skripts, schon mehrfach ad absurdum geführt.
ein Prozess weniger wird gestartet wenn man das grep im awk erledigt. Also statt
grep Location | awk '{print $2}'
kürzer:
awk '/Location/{print $2}'
Oder noch besser:
awk '$1 == "Location:" {print $2}'
Generell gut um Skripte besser verstehen:
http://partmaps.org/era/unix/award.html
Was ist nur aus dem guten alten Shell-Scripting geworden? Für diesen Trivialfall ist es mglw. nicht so von Bedeutung, aber spätestens wenn solche Pipe-Orgien in Funktionen landen, welche dann möglichst auch noch in Schleifen aufgerufen werden, dann ist Trauer angesagt. Schade das das Potential der Shell ständig unterschätzt wird. Hier mal eine Version komplett ohne grep und awk. (Funktioniert auch mit der busybox sh)
#!/bin/sh
set -- $(wget --max-redirect=0 -S -qO- "$@" -O /dev/null 2>&1)
while [[ $1 != "" ]]; do
if [[ $1 = "Location:" ]]; then echo $2; break; fi
shift
done
Ist ein wenig mehr Schreibkram, aber um Längen schneller da das Suchen und Starten zusätzlicher Prozesse entfällt.
Guter Einwand! Allerdings ist zu vermuten, dass der Autor nur gelegentlich etwas Shell verwendet und daher nicht auf diesen Code kommen konnte.
Ich muss auch gestehen, dass mir trotz umfangreicher Shell-Programmierung die Konstrukte "set --" und "[[ ... ]]" nicht geläufig waren. Wieder was gelernt!
Äh und warum funktioniert das?
Wieder so ein echtes Bash-Wunder,
"set --" -> vorher noch nie gesehen.
help set
-- Assign any remaining arguments to the positional parameters. If there are no remaining arguments, the positional parameters are unset.
Ist irgendwie genauso übel wie
while....
do
done < ....
Wobei diese obskuren Lösungen in bash immer zu den schnellsten gehören. In einem bash Buch (iirc vom apress Verlag) werden zig Varianten durchexerziert die Lösung mit dem < auf ein while/for war da iirc einer der schnellsten Lösungen.
Mag sein, das es um Längen schneller ist, aber mit dem "mehr an Schreibkram" hast du den Geschwindigkeitsvorteil deines Skripts, schon mehrfach ad absurdum geführt.
Den Schreibkram hat man einmalig, den Geschwindigkeitsvorteil jedes mal wenn man das Script benutzt.