Hallo, Am Fri, 19 Sep 2003, Jan Trippler schrieb:
Am Donnerstag, 18. September 2003 23:08 schrieb Jan Trippler: [..]
(ungetestet)
Ja, und bei näherem Nachdenken ist mir tatsächlich eingefallen, warum Du es so kompliziert machst - relative Links in andere Verzeichnisse ;)
Aber vielleicht gehts so: ich="$0" p="`pwd`" while test -n "`readlink \"$ich\"`"; do d="`dirname \"$ich\"`" test -n "$d" && cd "$d" || exit 1 ich="`readlink \"\`basename \"$ich\"\`\"`" done cd "$p" echo "ich bin $ich"
(ein bisschen getestet)
dh@slarty[4]: /tmp/test4 (0)$ sed -n '/^##/,$p' < ./usr/bin/foo.sh ### End DH ### Jan 1 ich="$0" while test -n "`readlink \"$ich\"`"; do ich="`readlink \"$ich\"`" done echo "ich bin $ich" ### Jan 2 ich="$0" p="`pwd`" while test -n "`readlink \"$ich\"`"; do d="`dirname \"$ich\"`" test -n "$d" && cd "$d" || exit 1 ich="`readlink \"\`basename \"$ich\"\`\"`" done cd "$p" echo "Jan2: ich bin $ich" dh@slarty[4]: /tmp/test4 (0)$ ./usr/bin/foo.sh IAM='/tmp/test4/opt/blubb/bin/foo.sh' ich bin ../local/bin/foo.sh Jan2: ich bin ../blubb/bin/foo.sh dh@slarty[4]: /tmp/test4 (0)$ Fast. Ich mach ja fast das gleiche, nur mit mehr Variablen und checks, ob's noch ein symlink ist und das ganze in eine Funktion verpackt... Bei dir fehlt dann noch das Aufloesen des letzten relativen links... Ausserdem habe ich bei deiner Version noch ein ungutes Gefuehl wg. der Schleifenbedingung. Aber meine Version hat(te) auch noch nen "Bug": Wenn das script direkt, und nicht via symlink aufgerufen wurden, waere "IAM=`pwd`" (egal wo `pwd` ist). Durch das Verschieben der Zuweisung p="$1" vor das 'if test -L' ist dieser Bug behoben: ==== find_real_name() { p="$1" # ! if test -L "$1" then # ! while test -L "$p" do d="`dirname \"$p\"`" test -d "$d" && cd "$d" || exit 1 p="`basename \"$p\"`" test -L "$p" && { r="`readlink \"$p\"`" || exit 2; } p="`pwd`/$r" done fi d="`dirname \"$p\"`" test -d "$d" && cd "$d" || exit 1 p="`basename \"$p\"`" rn="`pwd`/$p" echo "$rn" } ==== Ja, evtl. koenne man da noch mehr pro Zeile verschachteln, aber ist das sinnvoll? Oh, und da faellt mir ein, alle Versionen sollten einen Zaehler gegen symlink-loops haben... Naja, ich hab grad mal eine loop gebaut: lrwxrwxrwx 19 ./usr/bin/foo.sh -> ../local/bin/foo.sh lrwxrwxrwx 23 ./usr/local/bin/foo.sh -> ../../../opt/bin/foo.sh lrwxrwxrwx 20 ./opt/bin/foo.sh -> ../../usr/bin/foo.sh Und das script bricht ab mit: bash: ./usr/bin/foo.sh: Too many levels of symbolic links Also ist wohl nicht noetig ;) -dnh -- 18: Vorbereitet für den Multimediaeinsatz Es sind noch zwei Slots auf dem Motherboard frei. (Peter Berlich)